用两个栈实现队列
来源:互联网 发布:自学软件编程 编辑:程序博客网 时间:2024/06/07 09:15
对于这个问题的分析,我们可以转换为两个栈之间的来回循环倒的一个问题。
在这,我们应该清楚,两个数据结构的数据特性,一个是先进后出(栈),一个是后进先出(队列),所以,我们在这里可以这样分析:
当我们入队操作的时候,对第一个栈进行压栈;如果我们想要出栈的时候,这个时候其实是要出栈的是第一个栈的栈底元素。
所以这个时候我们把第一个栈栈顶元素push进入第二个栈,然后pop,这样依次到第一个栈空。
然后我们再pop第二个栈顶元素的top,这样就是实现了出队。
具体代码实现:
#pragma once#include<iostream>#include<stack>#include<assert.h>using namespace std;template<typename T> class CQueue{public://CQueue(void);//~CQueue(void);void appendTail(const T& node); //尾插 T deleteHead(); //头删size_t size(); //大小bool empty(); //判空T& front(); //得到头T& back(); //得到尾void print(); //输出队列private:stack<T> stack1;stack<T> stack2;};template<typename T>T& CQueue<T>::back() //得到尾{assert((!stack1.empty())||(!stack2.empty()));/*这个顺序是不能变的*/if(stack1.empty()) //如果第一个栈是空的{ //说明给导到第二个栈里去了while(!stack2.empty()) //把第二个栈的东西再倒回去{stack1.push(stack2.top());stack2.pop();}}return stack1.top();}template<typename T>T& CQueue<T>::front() //得到头{assert((!stack1.empty()) || (!stack2.empty()));if(stack2.empty()){while(!stack1.empty()){stack2.push(stack1.top());stack1.pop();}}return stack2.top();}template<typename T>size_t CQueue<T>::size()//大小{return stack1.size()+stack2.size();}template<typename T>bool CQueue<T>::empty() //判空{return stack1.empty()&&stack2.empty();}template<typename T> //尾插void CQueue<T>::appendTail(const T& element){stack1.push(element);}template<typename T> //头删且返回删去的T CQueue<T>::deleteHead(){if(stack2.size() <= 0){while(stack1.size()> 0){T &data = stack1.top();stack1.pop();stack2.push(data);}}if(stack2.size() == 0){cout<<"_error:";throw new exception("queue is empty");}T head = stack2.top();stack2.pop();return head;}
测试函数:
#include"CQueue.h"#define N 5int main(){ CQueue<int> cq; int base[N] = {1,8,3,6,7}; for(int i = 0;i<N;++i) { cq.appendTail(base[i]); } cout<<cq.size()<<endl; cq.appendTail(14); cout<<cq.back()<<"是尾"<<endl; cout<<cq.front()<<"是头"<<endl; int len = cq.size(); for(int i = 0;i<len;++i) { cout<<cq.deleteHead()<<"-->"; } cout<<endl; return 0;}
0 0
- 用两个栈实现队列 & 用两个队列实现栈
- 用两个队列实现栈&用两个栈实现队列
- 用两个栈实现队列 & 两个队列实现一个栈
- 两个栈实现队列&&用两个队列实现一个栈
- 用两个栈实现队列 & 两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个队列实现栈
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- 用两个栈实现队列
- struts2框架校验文件配置提示The content of element type "validators" must match "(validator)+".
- DDS-正弦-Modelsim和MATLAB
- MTK6577+Android之Camera驱动) ~% d
- Binder学习笔记
- 设计模式-状态模式
- 用两个栈实现队列
- Pixhawk原生固件PX4之日期时间的确定
- Spring Aop解析自定义注解
- AJax基于JavaScript实现注册时局部判断用户名是否已被使用
- Android动画最新最全详解包含Material Design动画
- “定时炸弹”
- Spring学习-28:Spring中的事务管理之事务的回顾
- 注解的简单介绍以及自定义注解
- 如何获取客户端访问的IP