剑指 Offer 31. 栈的压入、弹出序列
创始人
2024-05-29 06:36:07

摘要

剑指 Offer 31. 栈的压入、弹出序列

一、判断是否为栈解析

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

这道题需要利用给定的两个数组pushed和popped的如下性质:

  • 数组 pushed中的元素互不相同;
  • 数组 popped和数组 pushed的长度相同;
  • 数组 popped是数组 pushed的一个排列。

根据上述性质,可以得到如下结论:

  • 栈内不可能出现重复元素;
  • 如果pushed和popped是有效的栈操作序列,则经过所有的入栈和出栈操作之后,每个元素各入栈和出栈一次,栈为空。

因此,可以遍历两个数组,模拟入栈和出栈操作,判断两个数组是否为有效的栈操作序列。模拟入栈操作可以通过遍历数组 pushed实现。由于只有栈顶的元素可以出栈,因此模拟出栈操作需要判断栈顶元素是否与popped的当前元素相同,如果相同则将栈顶元素出栈。由于元素互不相同,因此当栈顶元素与popped的当前元素相同时必须将栈顶元素出栈,否则出栈顺序一定不等于popped。

根据上述分析,验证栈序列的模拟做法如下:

  • 遍历数组 pushed,将 pushed的每个元素依次入栈;
  • 每次将 pushed的元素入栈之后,如果栈不为空且栈顶元素与popped的当前元素相同,则将栈顶元素出栈,同时遍历数组 popped,直到栈为空或栈顶元素与 popped的当前元素不同。

遍历数组pushed结束之后,每个元素都按照数组pushed的顺序入栈一次。如果栈为空,则每个元素都按照数组popped的顺序出栈,返回true。如果栈不为空,则元素不能按照数组 popped的顺序出栈,返回false。

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {Stack stack=new Stack<>();int index=0;for (int i:pushed){stack.add(i);while (!stack.isEmpty()&&stack.peek()==popped[index]){stack.pop();index++;}}return stack.isEmpty();}
}

复杂度分析

  • 时间复杂度:O(n),其中n是数组 pushed和 popped的长度。需要遍历数组 pushed和 popped各一次,判断两个数组是否为有效的栈操作序列。
  • 空间复杂度:O(n),其中n是数组 pushed和 popped的长度。空间复杂度主要取决于栈空间,栈内元素个数不超过n。

博文参考

 《leetcode》

相关内容

热门资讯

福日电子(600203.SH)... 格隆汇3月9日丨福日电子(600203.SH)在投资者互动平台表示,全资子公司中诺通讯终端产品业务采...
关于2026年1月-2月远程培... 中基协字〔2026〕66号各机构及从业人员:按照2026年度基金从业人员后续培训工作计划,为进一步加...
安培龙:公司与客户合作情况达披... 投资者提问:扭矩传感器获特斯拉验证通过了吗董秘回答(安培龙SZ301413):尊敬的投资者朋友,您好...
唐姓股民向ST达华发起索赔 刘...   受损股民可至Hehson股民维权平台登记该公司维权:http://wq.finance.sina...
​南向资金今日净买入372.1... 转自:证券时报人民财讯3月9日电,南向资金今日净买入372.13亿港元,创单日净买入纪录新高。盈富基...