栈
顺序栈
#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<iomanip>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int SElemType;//定义元素类型
typedef int Status;
typedef struct{
SElemType *top;//栈顶指针
SElemType *base;//栈底指针
int stacksize;//栈可用的最大容量
}SqStack;//栈存储结构类型为SqStack
Status InitStack(SqStack &S);//初始化
Status Push(SqStack &S,SElemType e);//入栈
Status Pop(SqStack &S,SElemType &r);//出栈,用e返回
SElemType GetTop(SqStack S);//取栈顶元素
int main(){
SqStack S;
InitStack(S);
/*int n,i;
SElemType e;
cin>>n;
for(i=0;i<n;i++)
{
cin>>e;
Push(S,e);
}
for(i=0;i<n;i++)
{
cout<<GetTop(S)<<endl;
S.top=S.top-1;
}*/
/*SElemType r;
while(Pop(S,r))
cout<<r<<endl;*/
return 0;
}
Status InitStack(SqStack &S)//初始化
{
S.base=new SElemType[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)//入栈 栈顶入数
{
if(S.top-S.base==S.stacksize)
return ERROR;//判断栈满
*S.top++=e;//先存再加一
return OK;
}
Status Pop(SqStack &S,SElemType &r)//出栈,用e返回 栈顶出数
{
if(S.top==S.base)
return ERROR;//先判栈空
r=*--S.top; //先减一,再赋值
return OK;
}
SElemType GetTop(SqStack S)//取栈顶元素
{
if(S.top!=S.base)//栈非空
return *(S.top-1);//返回栈顶元素,栈顶指针保持不变
}
链栈
#include<iostream>
#include<fstream>
#include<string>
#include<cstring>
#include<iomanip>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define OVERFLOW -2
using namespace std;
typedef int ElemType;//定义元素类型
typedef int Status;
typedef struct StackNode
{
ElemType data;//数据域
struct StackNode *next;//指针域
}StackNode,*LinkStack;
Status InitStack(LinkStack &S);//初始化
Status Push(LinkStack &S,ElemType e);//入栈
Status Pop(LinkStack &S,ElemType &r);//出栈,用e返回
ElemType GetTop(LinkStack S);//取栈顶元素
int main(){
LinkStack S;
InitStack(S);
/*ElemType e;
int n,i;
cin>>n;
for(i=0;i<n;i++)
{
cin>>e;
Push(S,e);
}*/
/*for(i=0;i<n;i++)
{
cout<<GetTop(S)<<endl;
S=S->next;
}*/
/*ElemType r;
for(i=0;i<n;i++)
{
Pop(S,r);
cout<<r<<endl;
}*/
return 0;
}
Status InitStack(LinkStack &S)//初始化
{
S=NULL;//栈顶指针置空
return OK;
}
Status Push(LinkStack &S,ElemType e)//入栈
{
LinkStack p;
p=new StackNode;//生成新结点
p->data=e;
p->next=S;//将新结点插入栈顶
S=p;//修改栈顶指针为p
return OK;
}
Status Pop(LinkStack &S,ElemType &r)//出栈,用r返回
{
if(S==NULL)
return ERROR;//判断非空
r=S->data;//赋值给r
LinkStack p;
p=new StackNode;//生成新结点
p=S;//用p临时保存栈顶空间
S=S->next;
delete p;//释放原栈顶元素空间
return OK;
}
ElemType GetTop(LinkStack S)//取栈顶元素
{
if(S!=NULL)//栈非空
return S->data;//返回栈顶值
}