一、顺序栈的存储结构
#define MAXSIZE 100
typedef int SElemType;
typedef struct
{
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
} SqStack;
二、顺序栈的初始化
算法步骤:
(1)为顺序栈分配一个最大容量为MAXSIZE的数组空间,使base指向这段空间的基地址,即栈底。
(2)栈顶指针top初始为base,空栈。
(3)stacksize置为栈的最大容量MAXSIZE。
//顺序栈的初始化
int InitStack(SqStack &S)
{
//构造一个空栈S
S.base=new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)
{
cout<<"存储分配失败!"<<endl;
exit(0);
}
S.top=S.base;//top初始化为base,空栈
S.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
cout<<"顺序栈初始化成功!"<<endl;
return 1;
}
三、顺序栈的入栈
算法步骤:
(1)判断栈是否满
(2)将元素压入栈顶,栈顶指针加1。
//顺序栈的入栈
int Push(SqStack &S,SElemType e)
{
//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize)
{
cout<<"栈满!"<<endl;
return 0;
}
//*S.top++=e;这条等价于下面两条
*S.top=e;//元素e压入栈顶
S.top++;//栈顶指针加1
cout<<"元素入栈成功!"<<endl;
return e;
}
四、顺序栈的出栈
(1)判断栈是否为空。
(2)栈顶指针减1,栈顶元素出栈。
//顺序栈的出栈
int Pop(SqStack &S,SElemType e)
{
//删除S的栈顶元素,用e返回其值
if(S.top==S.base)
{
cout<<"出栈失败,栈空!"<<endl;
return 0;
}
//e=*--S.top;等价于以下两条
--S.top;//栈顶指针减一
e=*S.top;//栈顶元素赋值给e
cout<<"出栈成功!"<<endl;
return e;
}
五、取顺序栈的栈顶元素
算法步骤:
(1)当栈非空时,返回栈顶元素,栈顶指针保持不变。
//取顺序栈的栈顶元素
SElemType GetTop(SqStack S)
{
//返回S的栈顶元素,不修改栈顶指针
if(S.top!=S.base) //栈非空
{
cout<<"取顺序栈的栈顶元素成功!"<<endl;
return *(S.top-1);//返回栈顶元素的值,栈顶指针保持不变
}
}
六、从栈底遍历输出栈元素,与多元素入栈
//
void InputStack(SqStack &S)
{
cout<<"您希望先入栈几个元素:";
int e,n;
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"请输入第"<<i<<"个入入栈元素:";
cin >>e;
Push(S,e);
}
}
//遍历输出栈,从栈低往上遍历
void OutPutStack(SqStack &S)
{
cout<<"- - - - -"<<endl;
SElemType *p=S.base;
while (p!=S.top)
{
cout<<*p<<endl;
p++;
}
cout<<"- - - - -"<<endl;
}
七、完整代码:
#include <iostream>
#include<stdlib.h>
#define MAXSIZE 100
using namespace std;
typedef int SElemType;
typedef struct
{//顺序栈的存储结构
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈可用的最大容量
} SqStack;
//顺序栈的初始化
int InitStack(SqStack &S)
{
//构造一个空栈S
S.base=new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!S.base)
{
cout<<"存储分配失败!"<<endl;
exit(0);
}
S.top=S.base;//top初始化为base,空栈
S.stacksize=MAXSIZE;//stacksize置为栈的最大容量MAXSIZE
cout<<"顺序栈初始化成功!"<<endl;
return 1;
}
//顺序栈的入栈
int Push(SqStack &S,SElemType e)
{
//插入元素e为新的栈顶元素
if(S.top-S.base==S.stacksize)
{
cout<<"栈满!"<<endl;
return 0;
}
//*S.top++=e;这条等价于下面两条
*S.top=e;//元素e压入栈顶
S.top++;//栈顶指针加1
cout<<"元素入栈成功!"<<endl;
return e;
}
//顺序栈的出栈
int Pop(SqStack &S,SElemType e)
{
//删除S的栈顶元素,用e返回其值
if(S.top==S.base)
{
cout<<"出栈失败,栈空!"<<endl;
return 0;
}
//e=*--S.top;等价于以下两条
--S.top;//栈顶指针减一
e=*S.top;//栈顶元素赋值给e
cout<<"出栈成功!"<<endl;
return e;
}
//取顺序栈的栈顶元素
SElemType GetTop(SqStack S)
{
//返回S的栈顶元素,不修改栈顶指针
if(S.top!=S.base) //栈非空
{
cout<<"取顺序栈的栈顶元素成功!"<<endl;
return *(S.top-1);//返回栈顶元素的值,栈顶指针保持不变
}
}
//
void InputStack(SqStack &S)
{
cout<<"您希望先入栈几个元素:";
int e,n;
cin>>n;
for(int i=1; i<=n; i++)
{
cout<<"请输入第"<<i<<"个入入栈元素:";
cin >>e;
Push(S,e);
}
}
//遍历输出栈,从栈低往上遍历
void OutPutStack(SqStack &S)
{
cout<<"- - - - -"<<endl;
SElemType *p=S.base;
while (p!=S.top)
{
cout<<*p<<endl;
p++;
}
cout<<"- - - - -"<<endl;
}
int main()
{
SqStack S;
InitStack(S);
InputStack(S);
OutPutStack(S);
int e;
cout<<Pop(S,e)<<endl;
OutPutStack(S);
int top=GetTop(S);
cout<<"栈顶元素为:"<<top<<endl;
}