数据结构(一)、C++两个队列实现栈

(一)、C++两个队列实现栈

1、栈定义

栈(Stack)是由有限个数据类型相同元素组成的有序集合,对元素的操作只能在栈顶进行,遵循后进先出(Last In,First Out)的原则。

2、入栈原理

(1)、两个队列实现栈的入栈原理:

两个队列分别为栈队列(S)和辅助队列(T),插入元素时,压入辅助队列(T)中,然后将栈队列(S)中所有元素压入辅助队列(T),交换栈队列(S)和辅助队列(T),得到栈结果

(2)、实例分析

  • 插入首元素(2)
        /*
             插入元素:(2)
             辅助队列(T): 空                     (2)                                 (2)                          空 
                                 (T)插入(2)            将(S)中所有元素压入(T)中                 交换(T)(S)            
                                 ==========>                  ==========>                       ===============>                                 

             栈队列(S):  空                       空                                    空                          (2)

        */
  • 插入元素(6)
        /*
             插入元素:(6)
             辅助队列(T): 空                     (6)                                 (6)(2)                          空
                                 (T)插入(6)            将(S)中所有元素压入(T)中              交换(T)(S) 
                                 ==========>                  ==========>                       ===============>

             栈队列(S): (2)                    (2)                                    空                          (6)(2)

        */
  • 插入元素(7)
        /*
             插入元素:(7)
             辅助队列(T): 空                     (7)                               (7)(6)(2)                          空
                                 (T)插入(7)            将(S)中所有元素压入(T)中              交换(T)(S)
                                 ==========>                  ==========>                       ===============>

             栈队列(S):(6)(2)                   (6)(2)                                   空                          (7)(6)(2)

        */
  • 插入元素(3)
        /*
             插入元素:(3)
             辅助队列(T): 空                     (3)                              (3)(7)(6)(2)                          空
                                 (T)插入(3)            将(S)中所有元素压入(T)中              交换(T)(S)
                                 ==========>                  ==========>                       ===============>

             栈队列(S):(7)(6)(2)              (7)(6)(2)                                   空                          (3)(7)(6)(2) 

        */
  • 插入元素(1)
        /*
             插入元素:(1)
             辅助队列(T): 空                     (1)                             (1)(3)(7)(6)(2)                          空
                                 (T)插入(1)            将(S)中所有元素压入(T)中              交换(T)(S)
                                 ==========>                  ==========>                       ===============>

             栈队列(S):(3)(7)(6)(2)          (3)(7)(6)(2)                                   空                          (1)(3)(7)(6)(2)

        */

(3)、C++代码实现

        /**
         * @brief 插入
         */
        void push(T p_nVal)
        {
            m_queTemp.push(p_nVal);
            while (!m_queStack.empty())
            {
                m_queTemp.push(m_queStack.front());
                m_queStack.pop();
            }
            std::swap(m_queStack, m_queTemp);
            m_nCurrentSize++;
        }

2、出栈原理

  • 移除栈队列(S)头元素
  • C++代码实现
        /**
         * @brief 移除栈顶元素
         */
        void pop()
        {
            if (m_queStack.empty())
                return;
            m_queStack.pop();
            m_nCurrentSize--;
        }

3、整体代码

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

/**
 * @namespace 两个队列实现栈
 */
namespace stack_queue
{
    template<class T>
    struct Stack
    {
        std::queue<T> m_queStack;            // 栈队列
        std::queue<T> m_queTemp;             // 辅助队列
        uint32_t m_nCurrentSize = 0;         // 栈元素个数

        /**
         * @获取栈顶元素
         */
        int top() { return m_queStack.front(); }

        /**
         * @brief 插入
         */
        void push(T p_nVal)
        {
            m_queTemp.push(p_nVal);
            while (!m_queStack.empty())
            {
                m_queTemp.push(m_queStack.front());
                m_queStack.pop();
            }
            std::swap(m_queStack, m_queTemp);
            m_nCurrentSize++;
        }

        /**
         * @brief 移除栈顶元素
         */
        void pop()
        {
            if (m_queStack.empty())
                return;
            m_queStack.pop();
            m_nCurrentSize--;
        }

        /**
         * @brief 获取栈大小
         */
        void size() { return m_nCurrentSize; }

        /**
         * @brief 打印
         */
        void print_Stack()
        {
            std::queue<T> stackTemp = m_queStack;
            while (!stackTemp.empty())
            {
                std::cout << stackTemp.front() << " ";
                stackTemp.pop();
            }
            std::cout << std::endl;
        }
    };

    void test_stack_queue()
    {
        stack_queue::Stack<int> stackNt;
        stackNt.push(2);
        /*
             插入元素:(2)
             辅助队列(T): 空                     (2)                                 (2)                          空 
                                 (T)插入(2)            将(S)中所有元素压入(T)中                 交换(T)(S)            
                                 ==========>                  ==========>                       ===============>                                 

             栈队列(S):  空                       空                                    空                          (2)

        */

        stackNt.push(6);
        /*
             插入元素:(6)
             辅助队列(T): 空                     (6)                                 (6)(2)                          空
                                 (T)插入(6)            将(S)中所有元素压入(T)中              交换(T)(S) 
                                 ==========>                  ==========>                       ===============>

             栈队列(S): (2)                    (2)                                    空                          (6)(2)

        */

        stackNt.push(7);
        /*
             插入元素:(7)
             辅助队列(T): 空                     (7)                               (7)(6)(2)                          空
                                 (T)插入(7)            将(S)中所有元素压入(T)中              交换(T)(S)
                                 ==========>                  ==========>                       ===============>

             栈队列(S):(6)(2)                   (6)(2)                                   空                          (7)(6)(2)

        */

        stackNt.push(3);
        /*
             插入元素:(3)
             辅助队列(T): 空                     (3)                              (3)(7)(6)(2)                          空
                                 (T)插入(3)            将(S)中所有元素压入(T)中              交换(T)(S)
                                 ==========>                  ==========>                       ===============>

             栈队列(S):(7)(6)(2)              (7)(6)(2)                                   空                          (3)(7)(6)(2) 

        */

        stackNt.push(1);
        /*
             插入元素:(1)
             辅助队列(T): 空                     (1)                             (1)(3)(7)(6)(2)                          空
                                 (T)插入(1)            将(S)中所有元素压入(T)中              交换(T)(S)
                                 ==========>                  ==========>                       ===============>

             栈队列(S):(3)(7)(6)(2)          (3)(7)(6)(2)                                   空                          (1)(3)(7)(6)(2)

        */

        stackNt.print_Stack();         // 1 3 7 6 2

        stackNt.pop();
        stackNt.print_Stack();         // 3 7 6 2
        /*      
            栈队列(S):(1)(3)(7)(6)(2)        ==========>           (3)(7)(6)(2) 
        */

    }
}// namespace stack_queue

int main()
{
    stack_queue::test_stack_queue();
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值