用两个堆栈实现队列

本文介绍如何利用两个堆栈模拟实现队列的功能,详细阐述了插入和删除操作的逻辑。通过在堆栈s1中存储新元素,作为队列尾部,当需要删除元素时,若s2为空,则将s1中的元素转移至s2,确保队列的正确顺序。代码实现展示了这一过程。
摘要由CSDN通过智能技术生成

主要问题:使用两个堆栈实现队列的插入与删除。

基本思路:设两个堆栈为s1与s2,s1用于存放新插入的元素,队列的尾部;当要删除元素的时候,需要删除队列的头部元素,如果s2中没有元素,那么需要将s1中的元素依次弹出并压入到s2中;如果s2中有元素,那么直接弹出s2头部的元素就是队列尾部的元素。(因为元素入栈s1时,是从前向后,从s1弹出来,压入s2时,从后向前压入,那么从s2依次弹出的就是元素进入s1的顺序。)

代码如下:

//用两个堆栈实现队列的插入与删除(插入尾部,删除头部)
#include <iostream>
#include <stack>
#include <exception>
#include <string>
using namespace std;
class StackQueue
{
//public:
// StackQueue(void);
// ~StackQueue(void);
//
public:
 void appendTail(const int i);
 int deleteHead();

private:
 stack<int> stack1;
 stack<int> stack2;
};
void StackQueue::appendTail(const int i)
{
 stack1.push(i);
}

int StackQueue::deleteHead()
{
 if(stack2.size()<=0)
 {
  int data;
  while(stack1.size()>0)
  {
   data=stack1.top();
   stack1.pop();
   stack2.push
使用两个堆栈实现队列的算法如下: 1. 创建两个堆栈stack1和stack2,分别用于存储队列中的元素。 2. 元素入队操作:将元素压入stack1中。 3. 元素出队操作:先检查stack2是否为空,如果不为空,则直接弹出stack2的元素作为队列的出队元素;如果stack2为空,则将stack1中的所有元素依次弹出并压入stack2中,然后再从stack2中弹出元素作为队列的出队元素。 4. 元素获取操作:同出队操作,只是不弹出元素。 下面是使用Java语言实现的代码: ```java import java.util.Stack; public class QueueWithTwoStacks<T> { private Stack<T> stack1 = new Stack<>(); private Stack<T> stack2 = new Stack<>(); public void enqueue(T item) { stack1.push(item); } public T dequeue() { if (stack2.isEmpty()) { while (!stack1.isEmpty()) { stack2.push(stack1.pop()); } } return stack2.pop(); } public T peek() { if (stack2.isEmpty()) { while (!stack1.isEmpty()) { stack2.push(stack1.pop()); } } return stack2.peek(); } public boolean isEmpty() { return stack1.isEmpty() && stack2.isEmpty(); } public int size() { return stack1.size() + stack2.size(); } } ``` 在上面的代码中,enqueue()方法将元素压入stack1中,dequeue()方法先检查stack2是否为空,如果不为空,则直接弹出stack2的元素作为队列的出队元素;如果stack2为空,则将stack1中的所有元素依次弹出并压入stack2中,然后再从stack2中弹出元素作为队列的出队元素。peek()方法也是同理。isEmpty()方法检查队列是否为空,size()方法返回队列元素的个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值