用两个栈实现队列的操作
Posted xulu_258
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用两个栈实现队列的操作相关的知识,希望对你有一定的参考价值。
只要了解栈和队列的特性,这道题应该就不会有难度,插入元素的时候,都插入到第一个栈,然后删除的时候,可以把第一个栈中的元素全部弹出并压入第二个栈,这样的话第二个栈中的元素与第一个栈的元素顺序相反,先进的元素处于栈顶,可以直接进行删除,这样的话,删除一个元素的步骤是:当第二个栈不为空时,处于栈顶的元素总是最先进入队列的元素,可以弹出,如果第二个栈为空时,把第一个栈中的元素逐个弹出并压入第一个栈即可。如果要插入一个元素,还是压入第一个栈,这样的话后进的还是后出。代码如下:
//用两个栈实现队列的删除和插入操作
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 20
typedef struct seqstack
int data[MAXSIZE];
int top;
seqstack;
//初始化栈
seqstack *init()
seqstack *s;
s=malloc(sizeof(seqstack));
s->top=-1;
return s;
//判空栈
int empty(seqstack *s)
if(s->top==-1)
return 1;
else
return 0;
//入栈
int push(seqstack *s,int x)
if(s->top==MAXSIZE-1)
return -1;
else
s->top++;
s->data[s->top]=x;
return 0;
//出栈
int pop(seqstack *s)
if(empty(s)) return -1;
else
s->top--;
return 0;
//取栈顶元素
int top(seqstack *s)
int x;
if(empty(s)) return -1;
else
x=s->data[s->top];
return x;
void insert(int x,seqstack *s1) //插入队列元素相当于入栈
push(s1,x);
int delete(seqstack *s1,seqstack *s2)
int x,y;
if(empty(s2))
while(!empty(s1))
x=top(s1);
push(s2,x);
pop(s1);
if(empty(s2))
printf("empty queue");
return -1;
y=top(s2);
return y;
int main()
int a[4]=2,5,1,4;
int i,y=0;
seqstack *s1,*s2;
s1=init();
s2=init();
for(i=0;i<4;i++)
insert(a[i],s1);
y=delete(s1,s2);
printf("%d\\n",y);
扩展:使用两个队列实现栈,可以把要插入的元素a,b,c都插入到queue1,
然后要弹出一个元素就是c后插入的要先弹出,然后可以先把前两个元素删除并插入queue2中,这样的话删除c即从栈中弹出c元素,可以用同样的的方法弹出b元素,
要往栈内压入一个元素d,此时queue1中还有一个元素a,把d压入,再从栈内弹出一个元素,后进入的要先弹出,所以要弹出d,可以把a元素删除并插入queue2,然后删除d,即从栈中弹出元素d,
以上是关于用两个栈实现队列的操作的主要内容,如果未能解决你的问题,请参考以下文章