两个栈实现一个队列,两个队列实现一个栈
2016-07-17 00:32
232 查看
问题1:用两个栈实现一个队列,实现队列的push和delete操作
栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO),在实现delete时,我们的难点是如何将栈中最底层的数据拿出来,我们有两个栈,所以我们可以将一个栈中的数据依次拿出来压入到另一个为空的栈,另一个栈中数据的顺序恰好是先压入栈1的元素此时在栈2的上面,为了实现效率的提升,我们在delete时,判断栈2是否有数据,如果有的话,直接删除栈顶元素,在栈2为空时才将栈1的数据压入到栈2中,从而提高程序的运行效率,实现过程可以分为下面几个步骤:
1、push操作时,一直将数据压入到栈2中
2、delete操作时,首先判断栈2是否为空,不为空的情况直接删除栈2栈顶元素,为空的话将栈1的数据压入到栈2中,再将栈2栈顶元素删除。
实现代码如下:
运行结果如下:
问题2:用两个队列实现一个栈
因为队列是先进先出,所以要拿到队列中最后压入的数据,只能每次将队列中数据pop到只剩一个,此时这个数据为最后压入队列的数据,在每次pop时,将数据压入到另一个队列中。每次执行delete操作时,循环往复。(感觉效率低)每次删除时间复杂度O(N)
代码如下:
两个问题解决思路类似,主要就是要合理使用队列和栈的特点,并注意程序的效率。
栈的特性是先进后出(FILO),队列的特性是先进先出(FIFO),在实现delete时,我们的难点是如何将栈中最底层的数据拿出来,我们有两个栈,所以我们可以将一个栈中的数据依次拿出来压入到另一个为空的栈,另一个栈中数据的顺序恰好是先压入栈1的元素此时在栈2的上面,为了实现效率的提升,我们在delete时,判断栈2是否有数据,如果有的话,直接删除栈顶元素,在栈2为空时才将栈1的数据压入到栈2中,从而提高程序的运行效率,实现过程可以分为下面几个步骤:
1、push操作时,一直将数据压入到栈2中
2、delete操作时,首先判断栈2是否为空,不为空的情况直接删除栈2栈顶元素,为空的话将栈1的数据压入到栈2中,再将栈2栈顶元素删除。
实现代码如下:
template <typename T> class CQueue { public: CQueue(void) {} ~CQueue(void) {} void appendTail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; template<class T> void CQueue<T>::appendTail(const T& node)//在队列尾部添加数据 { stack1.push(node); } template<class T> T CQueue<T>::deleteHead() { T tmp = 0; if (stack2.empty()) //若栈2为空 { while (!stack1.empty()) { tmp = stack1.top(); stack2.push(tmp); stack1.pop(); } } tmp = stack2.top(); stack2.pop(); return tmp; }
运行结果如下:
问题2:用两个队列实现一个栈
因为队列是先进先出,所以要拿到队列中最后压入的数据,只能每次将队列中数据pop到只剩一个,此时这个数据为最后压入队列的数据,在每次pop时,将数据压入到另一个队列中。每次执行delete操作时,循环往复。(感觉效率低)每次删除时间复杂度O(N)
代码如下:
template <typename T> class CStack { public: CStack(void) {} ~CStack(void) {} void appendTail(const T& node); T deleteHead(); private: queue<T> q1; queue<T> q2; }; template<class T> void CStack<T>::appendTail(const T& node)//在栈尾部添加数据 { if (!q1.empty())//不为空的执行push操作 { q1.push(node); } else { q2.push(node); } } template<class T> T CStack<T>::deleteHead() { int ret = 0; if (q1.empty()) { int i = q2.size(); while (i > 1 )//将q2队列中的数据pop到只剩一个 { q1.push(q2.front()); q2.pop(); --i; } ret = q2.front(); q2.pop(); } else { int i = q1.size(); while (i > 1) { q2.push(q1.front()); q1.pop(); --i; } ret = q1.front(); q1.pop(); } return ret;
两个问题解决思路类似,主要就是要合理使用队列和栈的特点,并注意程序的效率。
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)