顺序栈的基本操作
0基本操作前的准备
<span style="font-size:18px;">#include <iostream>
using namespace std;
//两个C语言的头文件库
#include <malloc.h>
#include <stdlib.h>
//以下是宏定义
#define OK 1
#define ERROW 0
#define OVERFLOWE -2
#define TRUE 1
#define FALSE 0
#define INFEASIBLE -1
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
//以下是类型重新定义
typedef int SElemType;//重新定义SElemType为int型
typedef int Status;//重新定义Status为int型
//下面的是栈的定义和基本操作
typedef struct{//重新定义SqStck为结构类型
SElemType *base;//栈底指针
SElemType *top;//栈顶指针
int stacksize;//栈的当前可使用的最大容量
}SqStack;</span>
1构造一个空栈
<span style="font-size:18px;">//1构造一个空栈
Status InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
{
exit(OVERFLOW);//存储分配失败
}
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}</span>
2判断栈是否为空
<span style="font-size:18px;">//2判断栈是否为空
Status StackEmpty(SqStack S)
{
if(S.base==S.top)
{
return TRUE;
}
else
{
return FALSE;
}
}</span>
3清空一个栈
<span style="font-size:18px;">//3清空一个栈
Status ClearStack(SqStack &S)
{
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}</span>
4销毁一个栈
<span style="font-size:18px;">//4销毁一个栈
Status DestroyStack(SqStack &S)
{
delete S.base;
S.base=NULL;
S.top=NULL;
S.stacksize=0;
return OK;
}</span>
5取栈的长度
<span style="font-size:18px;">//5取栈的长度
Status StackLength(SqStack S)
{
return S.top-S.base;
}</span>
6取栈顶的元素
<span style="font-size:18px;">//6取栈顶元素
Status GetTop(SqStack S,SElemType &e)
{
if(S.top==S.base)
{
return ERROW;
}
e=*(S.top-1);
return OK;
}</span>
7出栈
<span style="font-size:18px;">//7出栈
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
{
return ERROW;
}
e=*--S.top;
return OK;
}</span>
8进栈
<span style="font-size:18px;">//8进栈
Status Push(SqStack &S,SElemType e)
{
if(S.top-S.base>=S.stacksize)
{
//栈满追加存储空间
SElemType *newbase=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!newbase)
{
exit(OVERFLOW);
}
S.base=newbase;
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}</span>
9栈元素的遍历
<span style="font-size:18px;">//9栈元素的遍历
Status StackTraverse(SqStack S,Status(*visit)(SElemType))
{
while(S.top>S.base)
{
visit(*S.base++);
}
return OK;
}
//遍历栈元素的输出
Status sc(SElemType i)
{
return i;
}</span>
10主函数
<span style="font-size:18px;">//主函数
int main()
{
SqStack s;
SElemType tp1;
SElemType tp2;
InitStack(s);
cout<<"0-9依次入栈并输出:"<<endl;
for(int i=0;i<10;i++)
{
Push(s,i);
GetTop(s,tp1);
cout<<tp1<<endl;
}
if(StackTraverse(s,sc))
{
cout<<"遍历栈成功"<<endl;
}
cout<<"栈中元素依次出栈并输出:"<<endl;
for(int j=0;j<10;j++)
{
Pop(s,tp2);
cout<<tp2<<endl;
}
ClearStack(s);
if(StackEmpty(s))
{
cout<<"栈清空成功"<<endl;
}
if(DestroyStack(s))
{
cout<<"栈销毁成功"<<endl;
}
return 0;
}</span>
输出的结果为: