您的位置:首页 > 其它

用两个栈实现队列的操作

2016-04-26 20:49 302 查看
只要了解栈和队列的特性,这道题应该就不会有难度,插入元素的时候,都插入到第一个栈,然后删除的时候,可以把第一个栈中的元素全部弹出并压入第二个栈,这样的话第二个栈中的元素与第一个栈的元素顺序相反,先进的元素处于栈顶,可以直接进行删除,这样的话,删除一个元素的步骤是:当第二个栈不为空时,处于栈顶的元素总是最先进入队列的元素,可以弹出,如果第二个栈为空时,把第一个栈中的元素逐个弹出并压入第一个栈即可。如果要插入一个元素,还是压入第一个栈,这样的话后进的还是后出。代码如下:

//用两个栈实现队列的删除和插入操作

#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,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: