介绍
栈的结构特点是“先进后出”,即最后一个被压入的元素会先弹出
队的结构特点是“先进先出”,即第一个进入队的元素先出来
题目1:
用两个栈实现队列,队列声明如下,实现函数appenTail和deleteHead
template<typename T> class cQueue { public: cQueue(void); ~cQueue(void); void appendTail();//在队尾插入 void deleteHead();//删除头 private: stack<T>stack1; stack<T>stack2; };
实现函数appenTail和deleteHead
基本思想:
用先把数据都存储到stack1中,此时stack2为空,删除时,若stack2为空,把stack1中的数据一个一个出栈push进stack2中,在stack2进行pop,若stack2不为空,直接从stack2中pop数据
template<typename T> void cQueue<T>::appendTail(const T &element) { stack1.push(element); } template<typename T> T cQueue<T>::deleteHead() { if (stack2.empty()) { while (!stack1.empty()) { stack2.push(stack1.top()); stack1.pop(); } } if (stack2.empty()) throw new exception("the queue is empty"); T top = stack2.top(); stack2.pop(); return top; }
测试:
往空的队列里插入、删除数据
往非空的队列里插入、删除数据
连续删除直到队列为空
举一反三
用两个队实现栈
分析:用q1和q2两个队列,先将数据放到q1中,若q1中有N和数据,pop时,先把N-1个数据放到q2中,q1中最后剩下的元素pop出即可。
template<typename T> class my_stack { public: void push(const T &x); T Pop(); private: queue<T> q1; queue<T> q2; }; template<typename T> void my_stack<T>::push(const T &x) { /*if ((q1.empty() && q2.empty()) || (!q1.empty() && q2.empty()))*/ if (q2.empty()) { q1.push(x); } if (q1.empty()) { q2.push(x); } } template<typename T> T my_stack<T>::Pop() { if (!q1.empty()) { while (q1.size() > 1) { q2.push(q1.front()); q1.pop(); } T pop = q1.front(); q1.pop(); return pop; } else { while (q2.size() > 1) { q1.push(q2.front()); q2.pop(); } T pop = q2.front(); q2.pop(); return pop; } }