双栈操作
struct Bothstack{
ElemType stack[stackMaxSize];
int top1,top2;
};
双栈操作的抽象数据类型可定义为:
DAT BSTACK is
Data:采用顺序结构存储的双栈,其存储类型为Bothstack
operations:
void InitStack(Bothstack& BS,int k);
//初始化栈。当k=1或2时对应置栈1或栈2为空,k=3时置两个格均为空
void Clearstack(BothStack& BS,int k)
//清除栈。当k=1或2时对应栈1或栈2被清除,k=3时两个栈均被清除
int StackEmpty(BothStack& BS,int k)
//判断栈是否为空。当k=1或2时判断对应的栈1或栈是否为空,k=3时
//判断两个栈是否同时为空。若判断结果为空则返回1,否则返回0
ElemType Peek(BothStack& BS,int k)
//取栈顶元素。当k=1或2时对应返回栈1或栈2的栈顶元素
void Push(BothStack& Bs,int k,const ElemType& item)
//进栈。当k=1或2时对应向栈1或栈2的顶端压入元素item
End BSTACK
void InitStack(BothStack& BS,int k)
{
if(k==1)
BS.top1=-1;
else if(k==2)
BS.top2=StackMaxSize;
else if(k==3){
BS.top1=-1;
BS.top2=StackMaxSize;
}
}
void ClearStack(BothStack& BS,int k)
{ //函数体同上
}
int StackEmpty(BothStack& BS,int k){
if(k==1)
return BS.top1==-1;
else if(k==2)
return BS.top2==StackMaxSize;
else if(k==3)
return(BS.top1==-1)&&(BS,top2==StackMaxSize);
else{
cerr<<"k的值不正确!"';
exit(1);
}
}
ElemType peek(BothStack& BS,int k)
{
if(k==1){
if(BS.top1==-1){
cerr<<"Stack 1 is empty!"<<end1;
exit(1);
}
return BS,stack(bs,top1);
}
else if(k==2){
if(BS.top2==StackMaxSize){
cerr<<"Stack 2 is empty!"<<end1;
exit(1);
}
return BS,stack[BS,top2];
}
else{
cerr<<"k的值不正确!";
exit(1);
}
}
void push(BothStack& BS,int k,const ElemType& item)
{
if(BS.top1==BS.top2-1){
cerr<<"Stack overflow!"<<end1;
exit(1);
}
if(k==1){
BS.top1++;
Bs.stack[BS.top1]=item;
}
else if(k==2){
BS.top1--;
BS.stack[BS.top2]=item;
}
}
ElemType pop(BothStack& BS,int k]
{
if(k==1){
if(BS.top==-1){
cerr<<"Stack 1 is empty!"<<end1;
exit(1);
}
BS.top--;
return BS,stack[BS.top1+1];
}
else if(k==2){
if(BS.top==StackMaxSize){
cerr<<"Stack 2 is empty!"<<end1;
exit(1);
}
BS.top2++;
return BS.stack[BS,top2-1];
}
else{
cerr<<"k的值不正确!";
exit(1);
}
}
///操作的算法
#include<iostream.h>
#include<stdlib.h>
const int StackMaxSize=50;
typedef int ElemType;
struct BothStack{
ElemType stack[StackMaxSize];
int top1,top2;
};
#include"bstack.h"
void main()
{
BothStack a;
InitStack(a,3);//初始化两个栈
int i,j,k;
//计算机产生20个随机数并输出,同时按奇偶数不同分别放入不同的栈中
for(i=0;i<20;i++){
j=rand()%100;
cout<<j<<"";
if(j%2==0)
push(a,1,j);
else
push(a,2,j);
}
cout<<end1;
//按照存入栈1中元素的次序输出栈1中的所有元素
cout<<"栈1:";
for(i=0;i<=a.top1;i++)
cout<<a.stack[i]<<"";
cout<<end1;
//按照存入栈2中元素的次序输出栈2中的所有元素
cout<<"栈2:";
for(i=StackMaxSize-1;i>=a.top2;i--)
cout<<a.stack[i]<<"";
cout<<end1;
//按照后进先出的原则输出每个栈中的所有元素
for(k=1;k<=2;k++){
if(k==1)
cout<<"栈1:";
else
cout<<"栈2:";
while(!StackEmpty(a,k))
cout<<Pop(a,k)<<"";
cout<<end1;
}
}
该程序输入并运行后将得到如下结果(由于机器系统和C++版本不同,你得到的结果可能
与此不同):
41 67 34 0 69 24 78 58 62 5 45 81 27 61 91 95 42 27 36
栈1:34 0 24 78 58 62 64 42 36
栈2:41 67 69 5 45 81 27 61 91 95 27
栈1:36 42 64 62 58 78 24 0 34
栈2:27 95 91 61 27 81 45 5 69 67 41
浙公网安备 33010602011771号