链式栈10种操作的实现

来源:互联网 发布:linux 清空日志内容 编辑:程序博客网 时间:2024/06/11 11:39

操作

时间复杂度(T(n))

空间复杂度(S(n))

判断是否为空

O(1)

O(1)

得到长度

O(n)

O(1)

得到栈顶元素

O(1)

O(1)

压入元素

O(1)

O(1)

弹出元素

O(1)

O(1)

反转顺序栈

O(n)

O(1)

冒泡排序

O(n^2)

O(1)

/*   数据结构分析与学习专栏*  Copyright (c) 2015, 山东大学计算机科学与技术专业学生*  All rights reserved.*   作    者:   高祥*   完成日期:  2015 年 4 月 3 日*   版 本 号:008 *任务描述:针对链式栈,实现10个基本操作*   1:建立链式栈*   2:判断链式栈是否为空*   3:求链式栈的元素个数*   4:输出链式栈*   5:得到链式栈的栈顶元素*   6:压入元素*   7:弹出元素*   8:反转当前链式栈*   9:将链式栈升序排序*  10:清空链式栈 *主要函数:*  1.Status InitStack(SqStack &s);//初始化栈:为栈分配初始空间*  2.void ReverseCreatStack(SqStack s);//逆序创建栈*  3.Status IsEmpty(SqStack s);//判断栈是否为空*  4.int StackLength(SqStack s);//求栈的元素个数*  5.void Output(SqStack s);//输出栈的元素*  6.void GetTop(SqStack s);//得到栈顶元素*  7.void Push(SqStack &s,ElemType elem);//压入元素*  8.void Pop(SqStack &s);//弹出元素*  9.void ReverseStack(SqStack s);//反转栈*  10.void SortStack(SqStack s);//栈元素排序*  11.void ClearStack(SqStack s);//清空栈*/#include<iostream>#include<cstdlib>using namespace std; #define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define FALSE 0 typedef int Status;typedef int ElemType; typedef struct node{   ElemType data;   struct node *next;} Node,*SqStack; Status InitStack(SqStack &s);//初始化栈:为栈分配初始空间 void ReverseCreatStack(SqStack s);//逆序创建栈 Status IsEmpty(SqStack s);//判断栈是否为空 int StackLength(SqStack s);//求栈的元素个数 void Output(SqStack s);//输出栈的元素 void GetTop(SqStack s);//得到栈顶元素 void Push(SqStack s,ElemType elem);//压入元素 void Pop(SqStack &s);//弹出元素 void ReverseStack(SqStack s);//反转栈 void SortStack(SqStack s);//栈元素排序 void ClearStack(SqStack s);//清空栈 void Interaction();//输出操作 int main(){   Interaction();    SqStack s;   int operate;   while(cin>>operate)    {       switch(operate)       {       case 0:           return 0;        case 1:           if(InitStack(s))           {                ReverseCreatStack(s);           }           break;        case 2:           if(IsEmpty(s))           {                cout<<"栈为空。\n";           }           else           {                cout<<"栈不为空。\n";           }           break;        case 3:           cout<<"栈中的元素个数是:"<<StackLength(s)<<endl;           break;        case 4:           Output(s);           break;        case 5:           GetTop(s);           break;        case 6:           ElemType elem;           cout<<"请输入要压入的元素:";           cin >>elem;           Push(s,elem);           cout<<"压入元素后的栈为:";           Output(s);           break;        case 7:           Pop(s);           break;        case 8:           ReverseStack(s);           cout<<"反转后的栈为:";           Output(s);           break;        case 9:           SortStack(s);           break;        case 10:            ClearStack(s);           break;        default:           cout<<"请输入正确的操作数字:";       }    }    return 0;} Status InitStack(SqStack &s)//初始化栈:为栈分配初始空间{   s=(SqStack)malloc(sizeof(Node));   if(!s)    {       cout<<"内存分配失败。\n";       return FALSE;    }   s->next=NULL;   return OK;} void ReverseCreatStack(SqStack s)//逆序创建栈{   cout<<"请输入元素的个数:";   int length;   cin>>length;   cout<<"请输入元素:";   for(int i=0; i<length; i++)    {       ElemType elem;       cin>>elem;       Push(s,elem);    }   cout<<"创建的栈为:";   Output(s);} Status IsEmpty(SqStack s)//判断栈是否为空{   if(!s||s->next==NULL)//未初始化或者初始化但未填充元素    {       return OK;    }   return FALSE;} int StackLength(SqStack s)//求栈的元素个数{   int num=0;   if(s)    {       s=s->next;    }   while(s)    {       num++;       s=s->next;    }   return num;} void Output(SqStack s)//输出栈的元素{   if(!IsEmpty(s))    {       s=s->next;       while(s)       {           cout<<s->data<<" ";           s=s->next;       }       cout<<endl;    }   else    {       cout<<"栈为空,无法输出。\n";    }} void GetTop(SqStack s)//得到栈顶元素{   if(IsEmpty(s))    {       cout<<"栈为空。\n";       return;    }   cout<<"栈顶元素是:"<<s->next->data<<endl;} void Push(SqStack s,ElemType elem)//压入元素{   SqStack newnode=(SqStack)malloc(sizeof(Node));   newnode->data=elem;   newnode->next=s->next;   s->next=newnode;} void Pop(SqStack &s)//弹出元素{   if(IsEmpty(s))    {       cout<<"栈为空,操作错误。\n";       return;    }   SqStack temp=s->next;   free(s);   s=temp;   cout<<"删除元素后的栈为:";   Output(s);} void ReverseStack(SqStack s)//反转栈{   if(!IsEmpty(s))    {       SqStack p=s->next,q=s->next->next,r;       p->next=NULL;       while(q)       {           r=q->next;           q->next=p;           p=q;           q=r;       }       s->next=p;       return;    }    cout<<"栈为空,无法反转。\n";} void SortStack(SqStack s)//栈元素排序{   //冒泡法排序   if(!IsEmpty(s))    {       SqStack p=s->next,q;       while(p)       {           q=p->next;           while(q)           {                if(p->data>q->data)                {                   swap(p->data,q->data);                }                q=q->next;           }           p=p->next;       }       cout<<"升序排序后的栈为:";       Output(s);       return;    }   cout<<"栈为空,无法排序。\n";} void ClearStack(SqStack s)//清空栈{   if(!IsEmpty(s))    {       SqStack p=s->next,q;       while(p)       {           q=p->next;           free(p);           p=q;       }    }   s->next=NULL;   cout<<"栈清空成功。\n";} void Interaction()//输出操作{   cout<<"请输入对应操作的序号:\n";   cout<<"0:退出程序;\n";   cout<<"1:建立链式栈;\n";   cout<<"2:判断链式栈是否为空;\n";   cout<<"3:求链式栈的元素个数;\n";   cout<<"4:输出链式栈;\n";   cout<<"5:得到链式栈的栈顶元素;\n";   cout<<"6:压入元素;\n";   cout<<"7:弹出元素;\n";   cout<<"8:反转当前链式栈;\n";   cout<<"9:将链式栈升序排序;\n";   cout<<"10:清空顺序栈  ;\n";}

0 0
原创粉丝点击