用两个栈实现队列

特性

栈的特性:后进先出

队列的特性:先进先出

解析

用两个栈实现队列,其实就是通过组合两个栈,一个作为入队栈,一个作为出队栈。

入队

这里将栈1当作入队栈:

void push(const T &data)
{
    stack1.push(data);
}

出队

将栈2作为出队栈:

void Pop()
{
    //如果两个栈都是空栈,此时说明队列是空的
    if (stack1.empty() && stack2.empty())
    {
        cout << "this queue is empty" << endl;
    }
    //如果栈2中有元素,那出队列就出栈2中的
    if (!stack2.empty())
    {
        stack2.pop();
    }
    //此时表明栈2已是空栈,再要出队列的话,那就需要把栈1中的所有元素入栈到栈2中
    else
    {
        while (stack1.size() > 0)
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
        stack2.pop();
    }
}

带返回值的Pop函数:

T &Pop()
{
    T head;
    //如果两个栈都是空栈,此时说明队列是空的
    if (stack1.empty() && stack2.empty())
    {
        cout << "this queue is empty" << endl;
    }
    //如果栈2中有元素,那出队列就出栈2中的
    if (!stack2.empty())
    {
        head = stack2.top();
        stack2.pop();
    }
    //此时表明栈2已是空栈,再要出队列的话,那就需要把栈1中的所有元素入栈到栈2中
    else
    {
        while (stack1.size() > 0)
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
        head = stack2.top();
        stack2.pop();
    }
    return head;
}

获取队头元素

队列的队头位于出队栈(栈2)的栈顶,只要栈2不空,就返回栈2的栈顶元素。如果栈2为空,那就把栈1中的所有元素全部压入栈2中,再取栈顶:

T &Front()
{
    //获取队头元素,此时队头位于栈2的栈顶
    assert(!stack1.empty() || !stack2.empty());
    if (stack2.empty())
    {
        while (!stack1.empty())
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
    }
    return stack2.top();
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇