双端堆栈的实现

来源:互联网 发布:网络歌曲在线试听 编辑:程序博客网 时间:2024/04/30 02:14

原题:设有两个栈S1和S2,都采用顺序表示,并且共享一个存储区V[0:MAXSIZE],为尽量利用空间,减少溢出的可能,现采用栈顶相对,迎面增长的方式存储。试设计公用栈基本操作,实现初始化,判空和出栈操作的算法。

分析:将两个栈底置在数组V[0:maxsize]的两端,迎面增长,只有当两个栈相遇时才会溢出,另外一个变量tag(=1,2)来表示S1和S2的操作。

#include<iostream.h>#define MAXSIZE 100 //存储空间最大容量#define ElemType chartypedef struct{ElemType v[MAXSIZE]; //栈空间int top1; //S1栈底int top2; //S2栈底}DuSqStack;int InitStack(DuSqStack &S){S.top1=0; //S.top1==0表示S1空S.top2=MAXSIZE - 1; //S.top2 == MAXSIZE - 1 表示S2空return 1;}int StackEmpty(DuSqStack S,int tag)//判栈空{//判空,tag==1时判S1是否为空,tag==2时判S2是否为空if(tag==1){if(S.top1==0)//S.top1==0表示S1空return 1;elsereturn 0;}else if(tag==2){if(S.top2==MAXSIZE - 1)//S.top2 == MAXSIZE - 1 表示S2空return 1;elsereturn 0;}else //tag值非法return -1;return 1;}int Push(DuSqStack &S,ElemType e,int tag)//入栈操作{if(S.top1+1==S.top2)//栈满return 0;else if(tag==1){S.v[S.top1++]=e; //tag==1时,S1入栈return 1;}else if(tag==2){S.v[S.top2--]=e;//tag==2时,S2入栈return 1;}elsereturn -1;//tag值非法return 1;}int Pop(DuSqStack &S,ElemType &e,int tag)//出栈操作{//tag==1时对S1出栈,tag==2时对S2出栈if(StackEmpty(S,tag)==1 || StackEmpty(S,tag)==-1)return -1;//栈空或tag值非法else{//栈非空且tag值合法if(tag==1)e=S.v[--S.top1];//用e返回S1栈顶元素值,同时删除栈顶,S.top1指向新栈顶elsee=S.v[++S.top2];//用e返回S2栈顶元素值,同时删除栈顶,S.top2指向新栈顶return 1;}}int Display(DuSqStack S)//输出两个栈的数据{int i;if(S.top1==0)cout<<"栈S1空!"<<endl<<endl;else{cout<<"栈S1的内容为:"<<endl;for(i=0;i<S.top1-1;i++){cout<<S.v[i]<<'-';}cout<<S.v[i];cout<<endl;}cout<<endl;if(S.top2==MAXSIZE - 1)cout<<"栈S2空!"<<endl<<endl;else{cout<<"栈S2的内容为:"<<endl;for(i=S.top2+1;i<MAXSIZE-1;i++){cout<<S.v[i]<<'-';}cout<<S.v[i];}cout<<endl<<endl;return 1;}int main(){DuSqStack S;ElemType e='a';InitStack(S);Push(S,e,2);Push(S,e,2);Push(S,e,2);Push(S,e,1);Push(S,e,1);Push(S,e,1);Push(S,e,1);Pop(S,e,1);Pop(S,e,1);Display(S);return 1;}


 

原创粉丝点击