用两个栈实现队列的操作

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

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

#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,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值