用两个栈实现队列的操作

来源:互联网 发布:北京滑雪场 知乎 编辑:程序博客网 时间:2024/05/16 19:06

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

//用两个栈实现队列的删除和插入操作#include<stdio.h>#include<malloc.h>#define MAXSIZE 20typedef 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,

0 0
原创粉丝点击