• 面试题7:用两个栈实现队列


    题目链接:http://ac.jobdu.com/problem.php?pid=1512

    思路:题目要求我们利用两个“先进后出”的栈实现一个“先进先出”的队列。

    插入时,将插入的元素放入stack1中。假设现在stack1中已经插入了若干元素,

    要进行删除操作。显然现在栈顶的元素是后插入的应该后出,栈底的元素才应该

    被删除,而在stack1中无法直接删除栈底元素。此时就应该借助stack2,之前

    未对stack2进行操作,stack2为空。将stack1中的元素逐个出栈压入stack2中,

    那么stack2中的栈顶元素就是要删除的元素。之后要插入元素就压入stack1中,

    要删除元素就将stack2栈顶元素删除,若stack2为空,则将stack1的全部元素

    逐个出栈压入stack2中,再完成删除,若stack1和stack2都为空,无法完成删除操作。

    注意:

    1、本题最好写成模板,更为通用。

    2、可以写个判断队列是否非空的函数。

    code:

     1 #include <iostream>
     2 #include <stack>
     3 #include <string>
     4 using namespace std;
     5 
     6 template<typename T> class CQueue
     7 {
     8 public:
     9     CQueue(void);
    10     ~CQueue(void);
    11 
    12     void appendTail(const T& node);
    13     T deleteHead();
    14     bool empty();
    15 private:
    16     stack<T> stack1;
    17     stack<T> stack2;
    18 };
    19 
    20 //构造函数
    21 template<typename T> CQueue<T>::CQueue(void)
    22 {
    23     ;
    24 }
    25 
    26 //析构函数
    27 template<typename T> CQueue<T>::~CQueue(void)
    28 {
    29     ;
    30 }
    31 
    32 template<typename T> void CQueue<T>::appendTail(const T& element)
    33 {
    34     stack1.push(element);
    35 }
    36 
    37 template<typename T> T CQueue<T>::deleteHead()
    38 {
    39     if (stack2.size() <= 0)
    40     {
    41         while (stack1.size() > 0)
    42         {
    43             T& data = stack1.top();
    44             stack1.pop();
    45             stack2.push(data);
    46         }
    47     }
    48 
    49     T head = stack2.top();
    50     stack2.pop();
    51     return head;
    52 }
    53 
    54 template<typename T> bool CQueue<T>::empty()
    55 {
    56     if (stack1.size() + stack2.size() <= 0) return true;
    57     return false;
    58 }
    59 
    60 
    61 int main()
    62 {
    63     int n;
    64     while (cin >> n)
    65     {
    66         CQueue<int> myQuence;
    67         for (int i = 0; i < n; ++i)
    68         {
    69             string myStr;
    70             cin >> myStr;
    71             if (myStr == "PUSH")
    72             {
    73                 int k;
    74                 cin >> k;
    75                 myQuence.appendTail(k);
    76             }
    77             else
    78             {
    79                 if (myQuence.empty()) cout << -1 << endl;
    80                 else cout << myQuence.deleteHead() << endl;
    81             }
    82         }
    83     }
    84     return 0;
    85 }
  • 相关阅读:
    迭代器,生成器,列表推倒式
    内置函数
    递归与二分算法
    装饰器
    函数进阶
    函数
    MLP神经网络 隐含层节点数的设置】如何设置神经网络隐藏层 的神经元个数
    用CNN及MLP等方法识别minist数据集
    ubuntu 安装Pangolin 过程
    ubuntu16.04 + Kdevelop + ROS开发和创建catkin_ws工作空间
  • 原文地址:https://www.cnblogs.com/ykzou/p/4408703.html
Copyright © 2020-2023  润新知