zoukankan      html  css  js  c++  java
  • 行百里者半九十 ——栈与队列

    剑指 Offer 09. 用两个栈实现队列

    剑指 Offer 30. 包含 min 函数的栈

    1、 用两个栈实现队列

    用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

    解:

    栈的特性是先进后出,而队列是先进先出,队列的插入操作最简单,直接插入栈A即可,队列的删除操作,即出队列,就需要将栈A中的元素出栈,再压入到栈B,再对栈B出栈,如此出队的顺序才满足先入先出。

     1 #include <iostream>
     2 #include <stack>
     3 
     4 using namespace std;
     5 
     6 //用两个栈实现队列
     7 class CQueue{
     8 public:
     9     CQueue(){
    10     }
    11 
    12     //入队 - 在队尾插入整数
    13     void appendTail(int value) {
    14         mStack1.push(value);
    15     }
    16 
    17     //出队 - 在队首删除整数并返回
    18     //先判断栈2是否不为空,栈2不为空,肯定是先将栈2出栈,栈2尾的元素肯定是最先进入的
    19     //再判断栈1(执行到此栈2必空),栈1为空,就返回-1,否则栈1元素压入栈2,再将栈2尾元素出栈
    20     int deleteHead() {
    21         if(!mStack2.empty()){
    22             int tmp = mStack2.top();
    23             mStack2.pop();
    24             return tmp;;
    25         }
    26         if(mStack1.empty()) return -1;
    27 
    28         while(!mStack1.empty()){
    29             int tmp = mStack1.top();
    30             mStack2.push(tmp);
    31             mStack1.pop();
    32         }
    33         int tmp = mStack2.top();
    34         mStack2.pop();
    35         return tmp;;
    36     }
    37 private:
    38     stack<int> mStack1;
    39     stack<int> mStack2;
    40 };
    41 
    42 int main()
    43 {
    44     cout << "Two Stack Make a Queue" << endl;
    45     CQueue queue;
    46     queue.appendTail(1);
    47     queue.appendTail(2);
    48     queue.appendTail(3);
    49     cout << queue.deleteHead() << endl;
    50     queue.appendTail(5);
    51     cout << queue.deleteHead() << endl;
    52     cout << queue.deleteHead() << endl;
    53     cout << queue.deleteHead() << endl;
    54 
    55     return 0;
    56 }

    2、包含 min 函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。

    解题思路:
    如何在时间复杂度为O(1)的情况下获取栈A中最小元素,可以借助一个辅助栈B。在每次push入栈时,和栈顶的元素比较。
    如果压入的元素比栈顶元素小(包括等于),则同时压入栈A、B,如果压入的元素比栈顶元素大,则只压入栈A。栈A保存所有元素,则栈B中保存A中的非严格降序的子序列。
    还有一点,在调用pop函数对A出栈时,也要同时更新栈B的元素,保持降序子序列与A同步。

     1 #include <iostream>
     2 #include <stack>
     3 
     4 using namespace std;
     5 
     6 class MinStack{
     7 public:
     8     MinStack() {}
     9 
    10     void push(int x) {
    11         mStack1.push(x);
    12         if(mStack2.empty() || x < mStack2.top())
    13             mStack2.push(x);
    14     }
    15 
    16     void pop() {
    17         if(mStack1.top() == mStack2.top())
    18             mStack2.pop();
    19         mStack1.pop();  //栈1和栈2要等比较完之后才能出栈
    20     }
    21 
    22     int top() {
    23         return mStack1.top();
    24     }
    25 
    26     int min() {
    27         return mStack2.top();
    28     }
    29 private:
    30     stack<int> mStack1;
    31     stack<int> mStack2;
    32 };
    33 
    34 int main()
    35 {
    36     cout << "Min Stack!" << endl;
    37     MinStack* minStack = new MinStack();
    38 
    39     minStack->push(0);
    40     minStack->push(1);
    41     minStack->push(0);
    42     cout << minStack->min() << endl;
    43     minStack->pop();
    44     cout << minStack->top() << endl;
    45     cout << minStack->min() << endl;
    46 
    47     return 0;
    48 }
  • 相关阅读:
    python simplejson and json 使用及区别
    python 网页抓取并保存图片
    word2vec剖析,资料整理备存
    centos 安装LAMP环境后装phpmyadmin
    centos 安装卸载软件命令 & yum安装LAMP环境
    Ubuntu终端快捷键使用
    Ubuntu终端文件的压缩和解压缩命令
    文本预处理去除标点符号
    朴素贝叶斯分类器的应用
    Win32环境下代码注入与API钩子的实现(转)
  • 原文地址:https://www.cnblogs.com/y4247464/p/15551951.html
Copyright © 2011-2022 走看看