链式栈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
- 链式栈10种操作的实现
- 链式栈的基本操作与实现
- 链式栈的基本操作实现c++
- 链式队列8种操作的实现
- 链式队列的操作实现
- 【PHP】链式操作的实现
- 栈的链式操作-------
- 栈的链式实现
- 链式栈的实现
- 栈的链式实现
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 链式栈的实现
- 栈的链式实现
- 栈的实现(链式)
- 链式栈的实现
- Java中删除文件、删除目录及目录下所有文件
- BZOJ1391【最小割】
- golang tcp
- SQL,NoSQL 以及数据库的实质
- 你用什么写简历:word?pdf?Latex?Markdown?Html?
- 链式栈10种操作的实现
- 类内/类外的回调函数---调用类的普通成员函数/类的静态成员函数/全局函数
- 第二章作业P51.14(计算斐波那契分数序列前n项之和。)
- Web服务器的工作原理
- Java方法参数传递(Java swap函数)
- 资源列表
- 在vs2010上配置opencv的环境
- 顺序栈10种操作的实现
- Sublime Text 3 Windows下简单安装配置