顺序表栈基本操作的实现 源代码:
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAXSIZE 100
//#define Status int
#define OK 1
#define OVERFLOW -2
#define False 0
#define True 1
#define ERROR 0
typedef int SElemType;
typedef int Status;
typedef struct
{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用最大容量
}SqStack;
//顺序栈的初始化
Status InitStack(SqStack &s)
{
s.base=new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
if(!s.base) exit(OVERFLOW); //存储分配失败
s.top=s.base; //top初始为base,空栈
s.stacksize=MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
return OK;
}
//入栈
Status Push(SqStack &s,SElemType e) //插入元素 e 为新的栈顶元素
{
if(s.top-s.base==s.stacksize) return ERROR; //栈满
*s.top=e;
s.top++; //也可以直接写成 *s.top++=e;
return OK;
}
//出栈
Status Pop(SqStack &s,SElemType &e) //删除 s 的栈顶元素,用 e 返回其值
{
if(s.top==s.base) return ERROR;
s.top--;
e=*s.top; //也可以直接写成 e=*--s.top;
return OK;
}
//取栈顶元素
SElemType GetTop(SqStack s) //返回 S 的栈顶元素,不修改栈顶指针
{
if(s.top != s.base) //栈非空
return *(s.top-1); //返回栈顶元素的值,不修改栈顶指针
}
//销毁栈
Status Destroy(SqStack s)
{
free(s.base);
s.base = NULL;
s.top = NULL;
s.stacksize=0;
return OK;
}
//遍历栈
Status StackTraver(SqStack s,Status(*visit)(SElemType))
{
SElemType *b = s.base;//此处不能直接用base或top移动,即不能改变原栈的结构
SElemType *t = s.top;
while(t > b)
visit(*b++);
//cout<<"\n";
return OK;
}
Status visit(SElemType c)
{
cout<<c<<endl;
return OK;
}
int main ()
{
SElemType e;
SqStack s;
InitStack(s) ;
int n;
cout<<"请输入要进栈的个数:"<<endl;
cin>>n;
while(n--)
{
int m;
cin>>m;
Push(s,m);
}
cout<<"栈中数据为:"<<endl;
StackTraver(s, visit);
Pop(s,e);
cout<<"出栈的元素是:"<<e<<endl;
Destroy(s);
return 0;
}