用栈实现队列

本文介绍了一种使用两个栈实现队列的方法,详细解释了如何通过push、pop、peek和empty等操作来模拟队列的行为。文章提供了完整的C语言代码实现,展示了如何在没有内置队列数据结构的情况下,利用栈来高效地进行队列操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 使用栈实现队列的下列操作:

push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。

示例:
MyQueue queue = new MyQueue();
queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false

说明:
你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

typedef int STDataType;
typedef struct Stack
{
	STDataType* _a;
	int _top; // 栈顶
	int _capacity; // 容量
}Stack;
Stack ps;

void StackInit(Stack* ps){
	assert(ps);
	ps->_a = NULL;
	ps->_top = 0;
	ps->_capacity = 0;
}

void StackDestory(Stack* ps){
	assert(ps);
	free(ps->_a);//
	ps->_a = NULL;
	ps->_top = 0;
	ps->_capacity = 0;
}

void StackPush(Stack* ps, STDataType x){
	assert(ps);
	if (ps->_top == ps->_capacity)
	{
		int newcapacity = ps->_capacity==0?4:2 * (ps->_capacity);//
		ps->_a= (STDataType*)realloc(ps->_a, newcapacity*sizeof(STDataType));
		assert(ps->_a != NULL);
		ps->_capacity = newcapacity;
	}
    ps->_a[ps->_top] = x;
	++(ps->_top);
}

void StackPop(Stack* ps){
	assert(ps&&ps->_top > 0);
	--(ps->_top);
}
 
STDataType StackTop(Stack* ps){
	assert(ps&&ps->_top > 0);
	return  ps->_a[ps->_top-1];
}
	
int StackEmpty(Stack* ps){
	assert(ps);
	if (ps->_top == 0){
		return 0;
	}
	else{
		return 1;
	}
}

int StackSize(Stack* ps){
	assert(ps);
	return ps->_top;
}

typedef struct {
  Stack inst;
  Stack outst;
} MyQueue;
MyQueue que;

/** Initialize your data structure here. */
MyQueue* myQueueCreate(int maxSize) {
   MyQueue* que = (MyQueue*)malloc(sizeof(MyQueue)*maxSize);
   StackInit(&que->inst);
   StackInit(&que->outst);
   return que;
}

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {
   StackPush(&obj->inst);
}

/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {
   if (StackEmpty(&obj->outst)!=0){
      int front = StackTop(&obj->outst);
      StackPop(&obj->outst);
      return front;
   }
   else{
      while (StackEmpty(&obj->inst)!=0){
         StackPush(&obj->outst,StackTop(&obj->inst));
         StackPop(&obj->outst);
       }
      int front = StackTop(&obj->outst);
      StackPop(&obj->outst);
      return front;
  }

/** Get the front element. */
int myQueuePeek(MyQueue* obj) {
      if (StackEmpty(&obj->outst)!=0){
      int front = StackTop(&obj->outst);
      return front;
   }
   else{
      while (StackEmpty(&obj->inst)!=0){
         StackPush(&obj->outst,StackTop(&obj->inst));
         StackPop(&obj->outst);
       }
      int front = StackTop(&obj->outst);
      return front;
  }
}

/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {
    return StackEmpty(&obj->inst)==0 && StackEmpty(&obj->outst)==0;
}

void myQueueFree(MyQueue* obj) {
    StackDestory(&obj->inst);
    StackDestory(&obj->outst);
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * struct MyQueue* obj = myQueueCreate(maxSize);
 * myQueuePush(obj, x);
 * int param_2 = myQueuePop(obj);
 * int param_3 = myQueuePeek(obj);
 * bool param_4 = myQueueEmpty(obj);
 * myQueueFree(obj);
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值