1. 程式人生 > 實用技巧 >C++利用棧實現佇列、利用佇列實現棧

C++利用棧實現佇列、利用佇列實現棧

1.利用棧來實現佇列

//利用棧實現佇列
//關鍵點:利用臨時棧將新元素放在原始棧的棧底,從而實現後進後出
#include<iostream>
#include<stack>
using namespace std;
class MyQueue
{
public:
    void push(const int& x) {
        stack<int>temp_stack;
        //假設_data的元素為[1,2,3,4],1所在位置為棧頂,
        //要想實現新元素的後進後出,需要將x放在棧底,即[1,2,3,4,x];

        
//將原棧裡的元素次序反轉,即此時臨時棧temp_stack為[4,3,2,1] //4所在位置為棧頂 while (!_data.empty()) { temp_stack.push(_data.top()); _data.pop(); } //將新元素放在棧頂,此時臨時棧temp_stack為[x,4,3,2,1] temp_stack.push(x); //再次反轉臨時棧裡的元素的次序,此時棧_data為[1,2,3,4,x] //新元素x被放在棧底,從而實現了,x後進後出
while (!temp_stack.empty()) { _data.push(temp_stack.top()); temp_stack.pop(); } } int pop() { int x = _data.top(); _data.pop(); return x; } int peek() { return _data.top(); } bool empty() {
return _data.empty(); } private: stack<int> _data; }; int main() { MyQueue mq; mq.push(1); mq.push(2); mq.push(3); cout << mq.pop() << endl; mq.push(4); mq.push(5); cout << mq.pop() << endl; }

2.利用佇列實現棧

//利用佇列實現棧
//關鍵點:利用臨時佇列將新元素x放在原始佇列頭部元素的前面,
//進而呼叫pop()時彈出x,從而實現後進先出
#include<queue>
#include<iostream>
class MyStack
{
public:
    void push(const int &x) {
        //將data_queue裡的所有元素視作一個整體a 
        //臨時佇列,利用臨時佇列將新元素x放在a的前面
        //重點在於:如何將x插入佇列[4,3,2,1]的頭部(假設1所在位置為佇列頭部),
        //即[4,3,2,1,x](而_data插入x後是[x,4,3,2,1]不能實現x的後進先出)。
        
        std::queue<int> _temp_queue;
        //將x插入臨時佇列頭部,此時_temp_queue為[x]
        _temp_queue.push(x);
        //將_data佇列裡的元素依次插入_temp_queue,此時_temp_queue為[4,3,2,1,x],
        //此時,已實現臨時佇列_temp_queue的x後進先出
        while (!_data.empty())
        {
            _temp_queue.push(_data.front());
            _data.pop();
        }
        //_temp_queue中的佇列元素依次插入_data佇列中。此時_data為[4,3,2,1,x]
        //,pop()時彈出x,實現了佇列_data的x後進先出
        while (!_temp_queue.empty()) {
            _data.push(_temp_queue.front());
            _temp_queue.pop();
        }
    }
    int pop() {
        int x = _data.front();
        _data.pop();
        return x;
    }
    int top() {
        return _data.front();
    }
    bool empty() {
        return _data.empty();
    }
private:
    std::queue<int> _data;//_data資料佇列儲存元素的順序就是棧儲存元素的順序
};

int main() {
    MyStack ms;
    ms.push(3);
    ms.push(4);
    //while(!ms.empty())
    std::cout << ms.pop() << std::endl;
    ms.push(5);
    std::cout << ms.pop() << std::endl;
}