- 两个栈模拟实现一个队列
- 实现思路:入栈时存储元素进入栈1,出栈时,将栈1中所有元素取出并放入栈2中,这样栈1中的元素就进行了逆置,即实现了与输入顺序相同。
- 列子:入栈元素顺序:1,2,3,4,5
那么此时栈1中元素自上而下顺序为:5,4,3,2,1
栈2元素为空。
出栈时,将栈1中元素依次取出放入栈2
此时栈2中元素自上而下顺序为:1,2,3,4,5(即保证了与输入顺序相同)
栈1元素为空
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 50
#define ElemType int
typedef struct{
ElemType data[MAXSIZE];
int top;
}SeqStack;
void InitStack(SeqStack *s){
s->top=-1;
}
bool StackEmpty(SeqStack &s){
if(s.top==-1)
return true;
return false;
}
bool Push(SeqStack &s,ElemType e){
if(s.top==MAXSIZE-1)
return false;
s.data[++(s.top)]=e;
return true;
}
bool Pop(SeqStack &s,ElemType &e){
if(s.top==-1)
return false;
e=s.data[(s.top)--];
return true;
}
bool GetTop(SeqStack &s,ElemType &e){
if(s.top==-1)
return false;
e=s.data[s.top];
return true;
}
void check(bool flag){
if(flag)
printf("操作成功!\n");
else
printf("操作失败!\n");
}
void display(SeqStack &s){
int index=s.top;
while(index>-1){
printf("%d ",s.data[index--]);
}
printf("\n");
if(index==s.top)
printf("队列元素为空!");
}
int main(){
int n;
//栈的初始化
SeqStack s,s2;
printf("顺序栈的基本操作\n");
printf("栈1的初始化\n");
InitStack(&s);
printf("栈1的初始化\n");
InitStack(&s2);
printf("模拟队列\n");
while(1){
int op;
int e;
bool flag;
printf("请选择操作\n1.进队列\n2.出队列\n3.判空\n4.获取队列头部元素\n5.打印队列中所有元素\n");
scanf("%d",&op);
switch(op){
case 1:
printf("入队列元素:");
scanf("%d",&e);
flag=Push(s,e);
check(flag);
if(!StackEmpty(s)&&!StackEmpty(s2)){
//如果栈2元素还没弹出时,再栈1加入新元素时,
//为了保证队列的连贯性,必须让前面所有元素出栈2
printf("清除栈2所有元素!\n");
while(!StackEmpty(s2)){
flag=Pop(s2,e);
if(flag)
printf("队列头部元素出队列,出队列元素为:%d\n",e);
}
}
break;
case 2:
while(!StackEmpty(s)){
Pop(s,e);
Push(s2,e);
}
flag=Pop(s2,e);
check(flag);
if(flag)
printf("队列头部元素出队列,出队列元素为:%d\n",e);
break;
case 3:
flag=StackEmpty(s2);
if(StackEmpty(s)&&StackEmpty(s2))
printf("队列为空!\n");
else
printf("队列非空!\n");
break;
case 4:
while(!StackEmpty(s)){
Pop(s,e);
Push(s2,e);
}
flag=GetTop(s2,e);
check(flag);
if(flag)
printf("队列头部元素为:%d\n",e);
break;
case 5:
while(!StackEmpty(s)){
Pop(s,e);
Push(s2,e);
}
display(s2);
default:
break;
}
}
return 0;
}