牛客网 剑指offer 5 用两个栈实现队列(用两个队列实现栈)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc15766228491/article/details/82560188

题目描述
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

栈的特点:先入后出,队列的特点:先入先出,可以用两个栈,在入队列的时候,先入第一个栈,出队列的时候,应该出的是栈尾的元素,因此将第一个栈的元素全部放入第二个栈内(前提是第二个栈为空)然后将第二个栈的栈顶元素就是第一个栈的栈底元素,弹出第二个栈的栈顶元素即可。

class Solution
{
public:
    void push(int node) {
        stack1.push(node);
    }

    int pop() {
        if(stack2.size()<=0){
            while(stack1.size()>0){
                int& data = stack1.top();
                stack2.push(data);
                stack1.pop();
            }
        }
        int& head = stack2.top();
        stack2.pop();
        return head;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

两个队列实现栈:先检测两个队列那个为空,在不为空的那个队列后面添加(如果两个都为空,就加第一个)要弹出栈顶的元素,也就是要弹出队列尾的元素,就把一个不为空的队列除了最后一个元素都添加到另一个队列中,然后弹出那个不为空的队列中的唯一一个值,就是原来的那个队列中的最后一个值了

#include <iostream>
#include <queue>
using namespace std;
template <typename T> class Cstack{
public:
    void append(const T&node);
    T deleteHead();
    size_t sizes();

private:
    queue<T> queue1;
    queue<T> queue2;
};
template <typename T> void Cstack<T>::append(const T &node) {
    if(queue2.size()<=0){
        queue1.push(node);
    }
    else queue2.push(node);
}
template <typename T> T Cstack<T>::deleteHead() {
    T result;
    if(queue2.size()<=0){
        while (queue1.size()>1){
            T &data = queue1.front();
            queue2.push(data);
            queue1.pop();
        }
        result = queue1.front();
        queue1.pop();
    }
    else{
        while(queue2.size()>1){
            T &data = queue2.front();
            queue1.push(data);
            queue2.pop();
        }
        result = queue2.front();
        queue2.pop();
    }
    return result;
}
template <typename T> size_t Cstack<T>::sizes() {
    if(queue2.size()!=0) return queue2.size();
    else return queue1.size();
}
int main()
{
    Cstack<int> C_test;
    for (int i = 0; i < 10; ++i) {
        C_test.append(i);
    }

    int lens = C_test.sizes();
    for (int k = 0; k < lens; ++k) {
        int result = C_test.deleteHead();
        cout<<result<<" ";
    }
}

猜你喜欢

转载自blog.csdn.net/abc15766228491/article/details/82560188