每日一题(37) - 两个队列实现栈
来源:互联网 发布:c语言变量名命名规则 编辑:程序博客网 时间:2024/06/05 17:10
题目来自剑指Offer
题目:两个队列实现栈
思路:一个队列存数据,另一个队列作为转存数据的临时队列。
注意:哪个队列存数据不定,那个队列作为临时队列也不定。
压栈时:找到一个有数据的队列,放入数据。如果两个队列都为空,则随便找一个队列存数据。
出栈时:找到那个存数据的队列,设其数据个数为n。
(1)对数列执行 n-1 次出队操作。
(2)把这些出队的数据转存到另一个队列中。
(3)最后那个数据即为所求,输出。
栈满:一个队列满,则栈满。
栈空:两个队列都为空,则空。
代码:
#include <iostream>#include <assert.h>using namespace std;const int SIZE = 5;class Queue{public:Queue();void AddTail(int nData);int RemoveHead();bool IsFull();bool IsEmpty();int Length();private:int m_nFront;int m_nRear;int m_nArr[SIZE];};class Stack{public:int Pop();void Push(int nData);bool IsEmpty();bool IsFull();int Length();private:Queue m_QueueOne;Queue m_QueueTwo;};Queue::Queue(){m_nFront = m_nRear = 0;}void Queue::AddTail(int nData){if (IsFull()){cout<<"队列已满!"<<endl;return;}else{m_nArr[(m_nRear++)%SIZE] = nData;}}int Queue::RemoveHead(){if (IsEmpty()){cout<<"队列空!"<<endl;return -1;}else{return m_nArr[(m_nFront++)%SIZE];}}bool Queue::IsFull(){if ((m_nRear + 1) % SIZE == m_nFront){return true;}else{return false;}}bool Queue::IsEmpty(){if (m_nFront == m_nRear){return true;}else{return false;}}int Queue::Length(){return (m_nRear - m_nFront + SIZE) % SIZE;}//**************STACK*********************** //弹出操作://对于有数据的队列://先把队列中除最后一个元素外的数据依次放入另一个队列中//把该队列中最后一个元素返回,此时该队列为空队列int Stack::Pop(){int nData = -1;assert((m_QueueOne.IsEmpty() && !m_QueueTwo.IsEmpty()) || (m_QueueTwo.IsEmpty() && !m_QueueOne.IsEmpty()));if (!m_QueueOne.IsEmpty())//队列1中有元素{while (m_QueueOne.Length() > 1){nData = m_QueueOne.RemoveHead();m_QueueTwo.AddTail(nData);}return m_QueueOne.RemoveHead();}else{while (m_QueueTwo.Length() > 1){nData = m_QueueTwo.RemoveHead();m_QueueOne.AddTail(nData);}return m_QueueTwo.RemoveHead();}}//入栈操作://找到一个有数据的队列压入数据。//两个队列都为空,随便找一个队列压入数据void Stack::Push(int nData){assert((!m_QueueOne.IsFull() && m_QueueTwo.IsEmpty()) || m_QueueOne.IsEmpty() && !m_QueueTwo.IsFull());if (m_QueueOne.IsEmpty()){m_QueueTwo.AddTail(nData);}else{m_QueueOne.AddTail(nData);}}int Stack::Length(){assert(m_QueueOne.IsEmpty() || m_QueueTwo.IsEmpty());if (m_QueueOne.IsEmpty()){return m_QueueTwo.Length();}else{return m_QueueOne.Length();}}bool Stack::IsEmpty(){assert(m_QueueOne.IsEmpty() || m_QueueTwo.IsEmpty());if (m_QueueOne.IsEmpty() && m_QueueTwo.IsEmpty()){return true;}else{return false;}}bool Stack::IsFull(){assert(m_QueueOne.IsEmpty() || m_QueueTwo.IsEmpty());if (m_QueueOne.IsFull() || m_QueueTwo.IsFull()){return true;}else{return false;}}int main(){Stack s;cout<<"push: ";for (int i = 0;i < SIZE - 1;i++){cout<<i<<" ";s.Push(i);}cout<<endl<<"pop: ";cout<<s.Pop()<<endl;cout<<"push: ";if (!s.IsFull()){cout<<10<<" ";s.Push(10);}else{cout<<"已满!"<<endl;}cout<<endl<<"push: ";if (!s.IsFull()){cout<<20<<" ";s.Push(20);}else{cout<<"已满!"<<endl;}cout<<endl<<"pop: ";while (!s.IsEmpty()){cout<<s.Pop()<<" ";}cout<<endl;system("pause");return 1;}
- 每日一题(37) - 两个队列实现栈
- 每日一题(36) - 用两个栈实现队列
- 每日一练——用两个栈实现队列&用两个队列实现栈
- 每日一题(33)——用两个栈实现一个队列的功能?要求给出算法和思路
- 每日一题之队列与栈的相互实现
- 每日一题——栈实现队列,队列实现栈
- 栈与队列【每日一题】
- 每日一题16:在一个数组中实现两个栈
- 【每日一题-6】栈和队列与替换空格
- 两个栈实现队列
- 两个队列实现栈
- 两个栈实现队列
- 两个栈实现队列
- 两个栈实现队列
- 两个队列实现栈
- 两个栈实现队列
- 两个 栈 实现队列
- 两个栈实现队列
- 图 邻接矩阵 邻接表
- 多线程编程(12) - 多线程同步之 Semaphore (信号对象)(转自万一博客)
- iOS应用审核的通关秘籍
- Dialog总结
- 等待消失的任务
- 每日一题(37) - 两个队列实现栈
- 黑马程序员--01.赋值语句练习【个人总结】
- Android 中创建avd和sdcard
- 多拉送了一些鸡蛋给圭多,意味深长地目送他远去。
- 2354:整理试卷
- MasonJS – 创建完美的砌体结构网页布局
- Android AVD创建及设置中各参数详解
- 解决ie8 中 focus函数不好使问题
- 获取当前用户的名字