用两个栈实现队列的操作

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,

以上是关于用两个栈实现队列的操作的主要内容,如果未能解决你的问题,请参考以下文章

两个栈实现一个队列

用两个栈实现一个队列

剑指offer5:用两个栈实现队列

用两个栈实现队列-剑指Offer

两个栈实现队列

剑指offer:用两个栈实现一个队列