数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
生活随笔
收集整理的這篇文章主要介紹了
数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、棧和隊列分析
棧是一種特殊的線性表。其特殊性在于限定插入和刪除數(shù)據(jù)元素的操作只能在線性表的一端進(jìn)行
隊列(Queue)也是一種運算受限的線性表,它的運算限制與棧不同,是兩頭都有限制,插入只能在表的一端進(jìn)行(只進(jìn)不出),而刪
除只能在表的另一端進(jìn)行(只出不進(jìn)),允許刪除的一端稱為隊尾(rear),允許插入的一端稱為隊頭?(Front)。
2、兩個隊列實現(xiàn)一個棧:利用隊列先進(jìn)先出的特性,在隊列一隊頭中插入一系列數(shù)據(jù),只能從隊尾刪除數(shù)據(jù),而此時再定義隊列二,
把隊列一先進(jìn)入隊列的數(shù)據(jù)存放在隊列二,然后刪除隊列一最新插入的數(shù)據(jù),從而模擬實現(xiàn)棧先插入進(jìn)來的數(shù)據(jù)先出棧的功能。
//兩個隊列實現(xiàn)一個棧 /* template<class T> class CStack { public:void appendHead(const T&x) //從棧頂插入元素{q1.push(x);}T deleteTail() //從棧頂刪除元素{if (q2.size() <= 0){while (q1.size()-1){T value = q1.front();q1.pop();q2.push(value);}}T tail = q1.front();q1.pop();return tail;} private:queue<T> q1;queue<T> q2; };//測試 void main() {CStack<int> st;st.appendHead(5);st.appendHead(2);st.appendHead(3);st.appendHead(9);st.appendHead(3);st.appendHead(2);cout << st.deleteTail() << endl; } */
2、兩個棧實現(xiàn)一個隊列:道理和兩個隊列實現(xiàn)一個棧的原理類似,在此不再贅述
//兩個棧實現(xiàn)一個隊列 //棧:先進(jìn)后出 //隊列:先進(jìn)先出template<class T> class TwoQueue { public:TwoQueue(){}void In_Queue(const T&x) //從隊尾插入數(shù)據(jù){s1.push(x);}T Out_Queue(){if (s2.size() == 0){while (!s1.empty()){T value=s1.top();s1.pop();s2.push(value);}}if (s2.size() > 0){T head = s2.top();s2.pop();return head;}else{return NULL;}}T Front_Queue(){if (s2.size() > 0){T head = s2.top();return head;}else{return NULL;}}size_t Empty_Queue(){return (s2.size()==0);}private:stack<T> s1; stack<T> s2; };int main() {TwoQueue<int> tq;tq.In_Queue(1);tq.In_Queue(2);tq.In_Queue(3);tq.In_Queue(4);cout << tq.Out_Queue() << endl;cout << tq.Out_Queue() << endl;cout<<tq.Front_Queue()<< endl;cout<<tq.Empty_Queue() <<endl;cout << tq.Out_Queue() << endl;cout << tq.Out_Queue() << endl;cout<<tq.Empty_Queue() <<endl; system("pause");return 0; }*/
總結(jié)
以上是生活随笔為你收集整理的数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle注射,中国联通沃支付一处Or
- 下一篇: 天涯明月刀服务器位置都在哪里,天涯明月刀