JZ31 栈的压入、弹出序列-C++
发布人:shili8
发布时间:2025-02-13 00:21
阅读次数:0
**栈的压入、弹出序列**
========================在计算机科学中,栈是一种线性数据结构,它遵循后进先出的原则。栈的压入和弹出操作是栈的基本操作。
**问题描述**
-------------
给定一个整数数组 `pushA` 和 `popA`,其中 `pushA[i]` 表示在栈中压入一个元素,而 `popA[i]` 表示从栈中弹出一个元素。请你判断这两个序列是否相等。
**示例**
--------
* 输入:`pushA = [1,2,3,4,5], popA = [4,5,3,2,1]`
输出:`true`
* 输入:`pushA = [1,2,3,4,5], popA = [4,3,5,1,2]`
输出:`false`
**解决方案**
-------------
我们可以使用一个栈来模拟压入和弹出操作。每当我们压入一个元素时,我们将其添加到栈顶;每当我们弹出一个元素时,我们从栈顶取出一个元素。
cppclass Solution { public: bool validateStackSequences(vector<int>& pushed, vector<int>& popped) { int n = pushed.size(); stack<int> s; int i =0; // 弹出序列的指针 for (int x : pushed) { // 压入序列的指针 while (!s.empty() && s.top() == popped[i]) { s.pop(); // 如果栈顶元素与弹出序列当前元素匹配,则弹出该元素 i++; // 移动弹出序列指针 } s.push(x); // 压入一个新元素到栈中 } return s.empty(); // 检查栈是否为空,表示压入和弹出序列相等 } };
**注释**
--------
* 我们使用一个栈 `s` 来模拟压入和弹出操作。
* 每当我们压入一个元素时,我们将其添加到栈顶。
* 每当我们弹出一个元素时,我们从栈顶取出一个元素,并移动弹出序列指针 `i`。
* 如果栈为空,则表示压入和弹出序列相等。
**测试**
--------
cppint main() { Solution solution; vector<int> pushed = {1,2,3,4,5}; vector<int> popped = {4,5,3,2,1}; cout << boolalpha << solution.validateStackSequences(pushed, popped) << endl; // true pushed = {1,2,3,4,5}; popped = {4,3,5,1,2}; cout << boolalpha << solution.validateStackSequences(pushed, popped) << endl; // false return0; }
**总结**
--------
本文介绍了栈的压入、弹出序列问题,并提供了一个解决方案。该解决方案使用一个栈来模拟压入和弹出操作,每当我们压入或弹出一个元素时,我们将其添加到或从栈顶取出。最终,检查栈是否为空即可确定压入和弹出序列是否相等。