剑指Offer09.用两个栈实现队列 C++

1、题目描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例 1:
输入:
[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”,“deleteHead”]
[[],[3],[],[],[]]
输出:[null,null,3,-1,-1]

2、VS2019上运行

#include <iostream>
#include <stack>
#include <vector>

using namespace std;

class CQueue {
private:
    stack<int> inStack, outStack;

    void in2out() {
        // 将输入栈中的元素转移到输出栈中
        while (!inStack.empty()) {
            outStack.push(inStack.top());
            inStack.pop();
        }
    }

public:
    CQueue() {}

    void appendTail(int value) {
        // 将元素添加到输入栈中
        inStack.push(value);
    }

    int deleteHead() {
        // 检查输出栈是否为空,为空则将输入栈中的元素转移到输出栈中
        if (outStack.empty()) {
            if (inStack.empty()) {
                // 输入栈和输出栈都为空,说明队列中没有元素
                return -1;
            }
            in2out();
        }
        // 输出栈的栈顶元素即为队列的头部元素,弹出并返回
        int value = outStack.top();
        outStack.pop();
        return value;
    }
};

int main() {
    // 操作序列
    vector<string> operations = { "CQueue", "appendTail", "deleteHead", "deleteHead", "deleteHead" };
    // 操作对应的参数
    vector<vector<int>> values = { {}, {3}, {}, {}, {} };

    // 创建 CQueue 对象
    CQueue q;

    // 遍历操作序列
    for (int i = 0; i < operations.size(); i++) {
        if (operations[i] == "CQueue") {
            // 创建新的 CQueue 对象
            q = CQueue();
            cout << "null" << endl; // 输出 null 表示操作无返回值
        }
        else if (operations[i] == "appendTail") {
            // 调用 appendTail 操作将参数值添加到队列尾部
            q.appendTail(values[i][0]);
            cout << "null" << endl; // 输出 null 表示操作无返回值
        }
        else if (operations[i] == "deleteHead") {
            // 调用 deleteHead 操作删除队列头部元素,并输出返回值
            int result = q.deleteHead();
            if (result == -1) {
                cout << -1 << endl;
            }
            else {
                cout << result << endl;
            }
        }
    }

    return 0;
}

运行结果:
null
null
3
-1
-1

3、C++中栈和队列

1、 队列(Queue)常见函数和操作:

#include <queue>

std::queue<int> q;  // 声明一个队列

q.push(item);       // 添加元素到队列的尾部
q.pop();            // 删除队列的头部元素
bool isEmpty = q.empty();  // 检查队列是否为空
int frontItem = q.front(); // 返回队列的头部元素

2、栈(Stack)常见函数和操作

#include <stack>

std::stack<int> s;  // 声明一个栈

s.push(item);       // 添加元素到栈的顶部
s.pop();            // 删除栈顶部的元素
bool isEmpty = s.empty();  // 检查栈是否为空
int topItem = s.top();     // 返回栈顶部的元素

4、解题思路

题目要求使用两个栈来实现一个队列。队列是一种先进先出(First-in-First-out,FIFO)的数据结构,而栈是一种后进先出(Last-in-First-out,LIFO)的数据结构。

在这个题目中,我们需要实现两个方法:

  • appendTail(value):向队列尾部添加一个元素。
  • deleteHead():删除队列头部的元素并返回该元素的值。

根据题目要求,我们需要使用两个栈来模拟队列的操作。具体实现如下:

  • 我们使用栈1(stack1)来模拟队列的尾部,元素从栈顶进入该栈。
  • 我们使用栈2(stack2)来模拟队列的头部,元素从栈顶出栈。
  • 当要添加元素时,我们直接将元素压入栈1中。
  • 当要删除元素时,如果栈2中有元素,我们直接从栈2栈顶弹出并返回元素。
  • .如果栈2中没有元素,我们将栈1中的元素依次弹出并压入栈2中,然后再从栈2的栈顶弹出并返回元素。

通过这样的实现,我们可以保证在栈2中的元素是先进入队列的,实现了先进先出的特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值