操作 | 时间复杂度(T(n)) | 空间复杂度(S(n)) |
判断是否为空 | O(1) | O(1) |
得到长度 | O(1) | 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 日
* 版 本 号:007
*任务描述:针对顺序栈,实现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
{
ElemType *base;//栈底指针:指向栈最底的元素(非空时)
ElemType *top;//栈顶指针:始终在栈顶元素的下一个位置(即:*(MyStack.top-1)是栈顶元素)
int stackcapacity;//栈的当前容量
int stacklength;//栈的当前元素个数
} 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.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s.base)
{
cout<<"内存分配失败。\n";
return FALSE;
}
s.top=s.base;//栈顶指针等于栈底指针:表示栈为空
s.stackcapacity=STACK_INIT_SIZE;//容量
s.stacklength=0;//元素个数
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);//调用压入元素的函数
}
s.stacklength=length;
cout<<"创建的栈为:";
Output(s);
}
Status IsEmpty(SqStack s)//判断栈是否为空
{
if(!s.base||s.base==s.top)//未初始化或者初始化但未填充元素
{
return OK;
}
return FALSE;
}
int StackLength(SqStack s)//求栈的元素个数
{
return s.stacklength;
}
void Output(SqStack s)//输出栈的元素
{
if(!IsEmpty(s))
{
ElemType * pointer=s.top-1;
while(1)
{
cout<<*pointer<<"";
if(pointer==s.base)//输出最后一个元素
{
break;
}
pointer--;
}
cout<<endl;
}
else
{
cout<<"栈为空,无法输出。\n";
}
}
void GetTop(SqStack s)//得到栈顶元素
{
if(IsEmpty(s))
{
cout<<"栈为空。\n";
return;
}
cout<<"栈顶元素是:"<<*(s.top-1)<<endl;
}
void Push(SqStack&s,ElemType elem)//压入元素
{
if(s.top-s.base>=s.stackcapacity)//容量不足,扩充容量
{
s.base=(ElemType*)realloc(s.base,(s.stackcapacity+STACKINCREMENT)*sizeof(ElemType));//更新栈底指针
if(!s.base)
{
cout<<"内存分配失败。\n";
return;
}
s.top=s.base+s.stackcapacity;//更新栈顶指针
s.stackcapacity+=STACKINCREMENT;//更新栈的容量
}
*s.top=elem;//填入元素
s.top++;//更新栈顶指针
s.stacklength++;//更新元素个数
}
void Pop(SqStack &s)//弹出元素
{
if(IsEmpty(s))
{
cout<<"栈为空,操作错误。\n";
return;
}
s.top--;
s.stacklength--;
cout<<"删除元素后的栈为:";
Output(s);
}
void ReverseStack(SqStack&s)//反转栈
{
if(!IsEmpty(s))
{
ElemType * before=s.top-1,*after=s.base;
while(before>after)
{
swap(*before,*after);
before--;
after++;
}
return;
}
cout<<"栈为空,无法反转。\n";
}
void SortStack(SqStack&s)//栈元素排序
{
//冒泡法排序
if(!IsEmpty(s))
{
ElemType * before=s.top-1,* after;
while(before!=s.base)
{
after=before-1;
while(1)
{
if(*before>*after)
{
swap(*before,*after);
}
if(after==s.base)
{
break;
}
after--;
}
before--;
}
cout<<"升序排序后的栈为:";
Output(s);
return;
}
cout<<"栈为空,无法排序。\n";
}
void ClearStack(SqStack&s)//清空栈
{
s.top=s.base;
s.stacklength=0;
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";
}