用两个栈实现一个队列,用两个队列实现一个栈,C++ STL版

不必解释了吧,这里代码应该就能说明问题了

#include <iostream>
#include <stack>
#include <queue>
using namespace std;

//Queue
template<typename T>
class Queue
{
public:
    void pop(void);
    void push(const T& t);
    const T& front(void);
    bool empty(void) const;
private:
    void left_to_rigth(void);
    stack<T> left_,right_;
};

template<typename T>
void Queue<T>::left_to_rigth(void)
{
    while(!left_.empty())
    {
        right_.push(left_.top());
        left_.pop();
    }
}

template<typename T>
bool Queue<T>::empty(void) const
{
    return (left_.empty() && right_.empty());
}

template<typename T>
void Queue<T>::push(const T& t)
{
    left_.push(t);
}

template<typename T>
void Queue<T>::pop(void)
{
    if (!right_.empty())
    {
        right_.pop();
    }
    else if (!left_.empty())
    {
        left_to_rigth();
    }
    else
    {
        throw "Queue is empty now ,can not pop!";
    }
}

template<typename T>
const T& Queue<T>::front(void)
{
    if (!right_.empty())
    {
        return right_.top();
    }
    else if (!left_.empty())
    {
        left_to_rigth();
        return right_.top();
    }
    else
    {
        throw "empty queu can not return front";
    }
}

//Stack
template<typename T>
class Stack
{
public:
    void pop(void);
    void push(const T& t);
    const T& top(void);
    bool empty(void);
private:
    void left_to_rigth(void);
    queue<T> left_,right_;
};

template<typename T>
void Stack<T>::left_to_rigth(void)
{
    if (!left_.empty())
    {
        int move = left_.size() -1;
        while (move > 0)
        {
            right_.push(left_.front());
            left_.pop();
            --move;
        }
    }
}

template<typename T>
bool Stack<T>::empty()
{
    return (left_.empty() && right_.empty());
}

template<typename T>
void Stack<T>::push(const T& t)
{
    left_.push(t);
}

template<typename T>
void Stack<T>::pop(void)
{
    left_to_rigth();
    left_.swap(right_);
    right_.pop();
}

template<typename T>
const T& Stack<T>::top(void)
{
    if (!left_.empty())
    {
        left_to_rigth();
        left_.swap(right_);
        const T& temp = right_.front();
        left_.push(right_.front());
        right_.pop();
        return temp;
    }
    else
    {
        throw "empty stack can not return top!";
    }
}

int main ()
{
    Queue<int> queue_int;
    cout<<"test queue : ";
    for(int i=0;i<10;++i)
    {
        queue_int.push(i);
    }
    while(!queue_int.empty())
    {
        cout<<queue_int.front()<<" ";
        queue_int.pop();
    }
    cout<<endl;

    Stack<int> stack_int;
    cout<<"test stack : ";
    for(int i=0;i<10;++i)
    {
        stack_int.push(i);
    }
    while(!stack_int.empty())
    {
        cout<<stack_int.top()<<" ";
        stack_int.pop();
    }
    cout<<endl;
    return 0;
}

时间: 2024-08-10 21:17:23

用两个栈实现一个队列,用两个队列实现一个栈,C++ STL版的相关文章

两个栈实现一个队列,两个队列实现一个栈

1.两个栈实现一个队列 有三种思路: 思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1 思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中 出队时,判断stack2是否为空,如果stack2为空,

两个栈实现一个队列和两个队列实现一个栈【算法导论课后题】

关于两个栈实现一个队列和两个队列实现一个栈问题,网上有很多资料.这里只描述自己认为操作最少的方法. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先判断s2是否为空,如果是则将s1中元素压入s2并弹出最上面元素,如果不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

用两个栈实现一个队列 &amp; 用两个队列实现一个栈

队列(先进先出)和栈(先进后出)都是常用的经常讨论的基本的数据结构,本文要讨论的是一对有趣的问题:如何用两个栈(队列)实现一个队列(栈),下面将分别说明,并附示例代码. 1.用两个栈实现一个队列 基本思路:初始有两个空栈s1和s2,当入队列是,将元素加入s1,而出队列则从s2出,当然s1与s2之间存在一定的交互. 入队:元素压入栈s1即可. 出队:首先看s2是否为空,若s2为空,则依次弹出s1的元素,加入s2中:若不为空,则不需额外处理: 之后弹出s2中的栈顶元素(即为队列的首元素)删除即可.

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

自定义栈的实现及使用两个栈模拟队列

一,使用单链表实现栈 ①栈需要一个栈顶指针 ②栈的基本操作有出栈和入栈,以及判断栈是否为空 ③单链表中每个结点表示一个栈元素,每个结点有指向下一个结点的指针.因此,在栈内部需要实现一个单链表.代码如下: public class Stack<T extends Comparable<? super T>>{ private class Node{ T ele; Node next; public Node(T ele) { this.ele = ele; } } Node top;

7 两个栈模拟队列,两个队列模拟栈

利用两个栈模拟队列 stack1,stack2 首先向stack1当中放入数据,如果需要输出数据,从stack2中delete数据,如果stack2为空,就把stack1中数据导入stack2 <span style="font-size:14px;">#include "static.h" #include <iostream> #include <stack> template<typename T> class

Algorithm --&gt; 两个栈实现队列和两个队列实现栈

两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如果s2不为空,把s2中的栈顶元素直接弹出:否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素. 代码: #include <stack> #include <iostream> #include <cassert> using namespace std; te

包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈  3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就不入栈当前的辅助栈:当出栈时,辅助栈元素相等时也要出栈. class Solution { public: stack<int> mystack1;//辅助栈 stack<int> minstack;//最小栈 void push(int value) { if(

使用java语言实现一个队列(两种实现比较)(数据结构)

一.什么是队列,换句话说,队列主要特征是什么? 四个字:先进先出 六个字:屁股进,脑袋出 脑补个场景:日常排队买饭,新来的排在后面,前面打完饭的走人,这就是队列: OK,思考一个问题,我为什么写了两种实现,它们的区别是什么,哪个性能更好一些? 我觉得学习一定要带着问题来学习: 二.队列的两种实现 1.数组队列 数组队列比较简单,基于之前写的动态数组所实现的,基本方法都是根据队列的特性从而选择性的调用动态数组的方法来实现的. public class ArrayQueue<E> implemen