C++利用棧實現佇列、利用佇列實現棧
阿新 • • 發佈:2020-09-15
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; }