> 文档中心 > 【牛客题霸】【模板】栈|栈的压入、弹出序列

【牛客题霸】【模板】栈|栈的压入、弹出序列


✅作者简介:热爱后端语言的大学生,CSDN内容合伙人
✨精品专栏:C++面向对象
🔥系列专栏:算法百炼成神

文章目录

  • 🔥前言
  • 1、AB1 【模板】栈
    • 1.1、解题思路
    • 1.2、代码实现与解释
  • 2、AB2 栈的压入、弹出序列
    • 2.1、解题思路
    • 2.2、代码实现与解释

🔥前言

本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面试真题,面试、找工作完全可以来这里找机会。此外,网站内的编码主题多样化,调试功能可运用性强,在这里刷题除了锻炼算法思想,同时也锻炼了根据要求自己设计输入输出的代码能力,可谓是非常注重用户体验。这么好的免费刷题网站还不快入手吗,快去注册开启算法百炼成神之路吧!(会在具体题目旁留下链接)

【牛客题霸】【模板】栈|栈的压入、弹出序列
【牛客题霸】【模板】栈|栈的压入、弹出序列

1、AB1 【模板】栈

对应题目链接:算法入门-AB1

题目叙述:

【牛客题霸】【模板】栈|栈的压入、弹出序列
【牛客题霸】【模板】栈|栈的压入、弹出序列

1.1、解题思路

  1. 此题第一个要求就是实现一个栈,因此切记不可直接包含stack头文件,而是自己模拟一个栈类,同时按照要求完善pushpoptop方法。
  2. 接下来注意输入描述的内容,从这里可以知道我们最多循环操作100000次,那么栈的容量就可以设置成这个数,同时栈的下标应该从-1开始。
  3. 输出描述就是三个方法的完善,通过分支语句if-else即可完成。

1.2、代码实现与解释

本题源码:

#include using namespace std;class stack {    int s[100000];    int index = -1;  public:    void push(int x) { index++; s[index] = x;    }    void top() { if (index < 0)     cout << "error" << endl; else     cout << s[index]<<endl;    }    void pop() { if (index < 0)     cout << "error" << endl; else     cout << s[index--] << endl;    }};int main() {    stack s;    int n;    cin >> n;    for (int i = 0; i < n; i++) { string op; cin >> op; if (op == "push") {     int x;     cin >> x;     s.push(x); } else if (op == "pop") {     s.pop(); } else if (op == "top") {     s.top(); }    }    return 0;}

重要代码注释:

  • push方法用来压栈,让下标加一然后将值赋给数组里对应的位置
  • top方法其实就是打印栈顶的值,就是当前下标对应的值,由于题目要求需要加判断,如果栈空,打印error,还有一个细节就是输出都是单个占一行,因此牵扯到打印语句都要加endl
  • pop方法在top方法的基础上让栈顶指针减一,相当于让栈顶元素出栈
  • 主函数中自己设计的输入输出代码,大家可以自行参考

2、AB2 栈的压入、弹出序列

对应题目链接:算法入门-AB2

题目叙述:

【牛客题霸】【模板】栈|栈的压入、弹出序列

2.1、解题思路

根据题目描述可知两个整数序列已经给出,让我们判断第二个序列能否是第一个序列的弹出顺序,因此当然要采用辅助栈来解题。

  • 比较序列一定涉及到了遍历,而且序列长度已知,采用for 循环来逐个与第二个序列比较,一旦栈顶元素与其不等,那么一定不是弹出顺序。
  • 接下来就是对入栈与出栈的设计:
    • 第一个序列入栈前逐个与第二个序列的值进行对比,若不相等一直让第一个序列入栈,相等的话就可以让第二个序列向后走,重复操作直到出现不相等或者第二个序列遍历结束。
    • 相等或者不相等都会让第一个序列入栈,区别是相等时入栈后就要出栈,让后第二个序列向后走,这点可以在代码中体现。

2.2、代码实现与解释

本题源码:

class Solution {  public:    bool IsPopOrder(vector<int> pushV, vector<int> popV) { int n = pushV.size(); //辅助栈 stack<int>s; //入栈下标 j int j = 0; //遍历出栈数组 for (int i = 0; i < n; i++) {     //入栈:栈为空或者栈顶不等于出栈数组     while (j < n && (s.empty() || s.top() != popV[i])) {  //使用 j++既入栈又能递增  s.push(pushV[j++]);     }     //栈顶等于出栈数组就取栈顶,继续比较     if (s.top() == popV[i])  s.pop();     //如果栈顶不匹配说明不匹配     else  return false; } return true;    }};

重要代码注释:

  • for 循环中下标i主要是为了控制第二个序列对应位置的值,while循环的条件比较多,j<n是防止第一个序列越界,与之并列的是为了防止栈空或者是当前已匹配栈顶元素被新元素取代。
  • 剩下的大家可以将数据带入代码,感受这个压栈与弹出的逻辑
  • 这个题解用到了vectorstack容器的基本操作,如果看起来困难可以先翻阅我的相关文章

这两道有关栈的算法题解分享到此结束,希望能给大家带来帮助,同时希望大家可以去挑战一下,题目链接已经放在文章里了