剑指offer 学习笔记 栈的压入、弹出序列
面试题31:栈的压入、弹出序列。输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
解决这个问题很直观的想法是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从栈中弹出数字。
判断方法:如果下一个要弹出的数字刚好等于栈顶数字,那么直接弹出。如果下一个要弹出的数字不等于栈顶数字,那么把压栈序列的数字继续压入辅助栈,直到把要弹出的数字压入栈顶为止。如果所有数字都压入栈后仍然没有找到下一个要弹出的数字,那么该序列不是一个弹出序列:
#include <iostream>
#include <stack>
using namespace std;
bool IsPopOrder(const int* pPush, const int *pPop, const int length) {
if (pPush == nullptr || pPop == nullptr || length < 1) {
return false;
}
stack<int> dataStack;
const int* pNextPush = pPush, * pNextPop = pPop;
while (pNextPop - pPop < length) { // 弹出序列还没弹完时
while (dataStack.empty() || dataStack.top() != *pNextPop) { // 此时栈为空或栈顶元素和要弹出的元素值不同,则继续压栈
if (pNextPush - pPush == length) { // 压栈序列结束
break;
}
dataStack.push(*pNextPush);
++pNextPush;
}
if (dataStack.top() != *pNextPop) { // 上述循环结束时,要么栈顶元素与要弹出的值相等,要么不相等并且压入序列结束,当后一种情况时
break;
}
dataStack.pop();
++pNextPop;
}
if (dataStack.empty() && pNextPop - pPop == length) { // 当栈为空且弹出序列结束时,匹配成功
return true;
}
return false;
}
int main() {
int push[] = { 1 };
int pop[] = { 1,0 };
if (IsPopOrder(push, pop, 1)) {
cout << "匹配成功。" << endl;
} else {
cout << "匹配失败。" << endl;
}
}
以上为剑指offer中的代码,但该代码没有对push和pop序列长度做出判断,造成以上的输入也能匹配成功。因此最好再加上判断压入弹出序列长度是否相等且等于length的代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2019-03-04 JAVA super
2019-03-04 JAVA方法重写(override)