成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

棧的壓入與彈出序列校驗

開發(fā) 前端
仔細分析題目后,我們很直觀的想法就是構造一個輔助棧,把壓入序列中的數(shù)字依次壓入該輔助棧。按照彈出序列的順序依次從該棧中彈出數(shù)字,如果輔助棧被清空則代表此序列是它的一個彈出序列,否則就不可能是一個彈出序列。

前言

有兩個整數(shù)序列,第一個序列表示棧的壓入順序,判斷第二個序列是否為該棧的彈出順序。假設壓入棧的數(shù)字均不相等。例如,序列[1, 2, 3, 4, 5]是某棧的壓棧序列,序列[4, 5, 3, 2, 1]是該棧序列對應的一個彈出序列,但[4, 3, 5, 1, 2]就不可能是該壓棧序列的彈出序列。

思路分析

仔細分析題目后,我們很直觀的想法就是構造一個輔助棧,把壓入序列中的數(shù)字依次壓入該輔助棧。按照彈出序列的順序依次從該棧中彈出數(shù)字,如果輔助棧被清空則代表此序列是它的一個彈出序列,否則就不可能是一個彈出序列。

彈出序列滿足條件

如下圖所示,它的壓入過程為:

取出彈出序列的第1個元素,維護一個已取索引,在壓入序列中從已取索引位置開始尋找與之相等的元素,將它之前的數(shù)字和其本身依次入棧,每取1個元素就將索引自增1次。

此時,棧頂元素與彈出序列的第1個元素相等,將棧頂元素出棧。

取出彈出序列的第2個元素,在壓入序列中從已取索引位置開始尋找與之相等的元素,將它之前的數(shù)字和其本身依次入棧。

此時,棧頂元素與彈出序列的第2個元素相等,將棧頂元素出棧。

取出彈出序列的第3個元素,此時,壓入序列的元素已經(jīng)被取完。我們繼續(xù)判斷 輔助棧中的元素是否與彈出序列的元素相等。

棧頂元素為3,要彈出的元素也是3,二者相等,棧頂元素出棧;

取出彈出序列的第4個元素;

棧頂元素為2,要彈出的元素也是2,二者相等,棧頂元素出棧;

取出彈出序列的第5個元素;

棧頂元素為1,要彈出的元素也是1,二者相等,棧頂元素出棧;

彈出序列已取完,輔助棧已清空。 該彈出序列屬于壓入序列的一個彈出順序;

彈出序列不滿足條件;

接下來,我們來分析下它不是壓入序列的彈出順序的情況,它的壓入過程與滿足條件時一樣,唯獨不同的是,彈出序列的第3個元素從輔助棧出棧后,壓入序列已經(jīng)被取完。此時,彈出序列的第4個元素是1,輔助棧的棧頂元素是2,二者不等,那么該序列肯定不是壓入序列的彈出順序。

圖片

實現(xiàn)代碼

經(jīng)過上面的分析,我們已經(jīng)知道了如何解決這個問題。思路已明確,接下來,我們就可以愉快的進入編碼環(huán)節(jié)了。

export function StackPushAndPopSequence(
pushSequence: Array<number>,
popupSequence: Array<number>
): boolean {
if (pushSequence.length === 0 || popupSequence.length === 0) return false;
// 下一個入棧、出棧索引
let nextPushIndex = 0;
let nextPopIndex = 0;
// 輔助棧
const stackData = new Stack();
// 下一個彈出序列存在則執(zhí)行進一步的判斷
while (nextPopIndex < popupSequence.length) {
// 下一個彈出序列的元素與棧頂元素不等則入棧
while (
nextPushIndex < pushSequence.length &&
popupSequence[nextPopIndex] !== stackData.peek()
) {
stackData.push(pushSequence[nextPushIndex]);
nextPushIndex++;
}

// 棧頂元素與下一個彈出序列元素相等則出棧
if (stackData.peek() === popupSequence[nextPopIndex]) {
stackData.pop();
nextPopIndex++;
} else {
// 元素不等則終止循環(huán),此時壓入序列已經(jīng)全部壓入輔助棧,該序列不可能是一個彈出序列
break;
}
// 輔助棧清空,則代表彈出序列是正確的
if (stackData.isEmpty()) {
return true;
}
}
return false;
}

最后,我們將開頭列舉的例子來驗證下上述代碼是否正確執(zhí)行,如下所示:

const pushSuite = [1, 2, 3, 4, 5];
const popSuite1 = [4, 5, 3, 2, 1];
const popSuite2 = [4, 3, 5, 1, 2];
const result1 = StackPushAndPopSequence(pushSuite, popSuite1);
const result2 = StackPushAndPopSequence(pushSuite, popSuite2);
console.log(result1, result2);

圖片

示例代碼

本文所用代碼完整版請移步:

  • StackPushAndPopSequence.ts
  • stackPushAndPopSequence-test.ts

責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2021-12-02 09:13:56

序列壓入

2012-05-11 10:22:26

Linuxdirspushd

2025-04-07 11:10:00

Python列表開發(fā)

2022-04-02 09:56:41

Vue2響應式系統(tǒng)

2023-12-28 09:55:08

隊列數(shù)據(jù)結構存儲

2012-12-20 09:41:49

JVMJava

2011-06-15 10:53:05

C語言

2023-01-16 08:09:22

PulsarMQ

2022-11-25 18:49:11

云原生

2012-04-13 10:45:59

XML

2022-09-07 07:27:36

函數(shù)元素

2018-11-13 12:52:50

Linux內(nèi)核棧回溯

2018-03-19 10:20:23

Java序列化反序列化

2010-01-26 17:35:09

C++棧

2022-09-21 23:41:40

機器學習開源數(shù)據(jù)

2024-02-02 08:25:34

隊列與棧Python數(shù)據(jù)結構

2013-04-16 10:48:04

Python序列

2020-11-26 18:18:21

微服務業(yè)務規(guī)模技術

2021-07-15 11:31:22

遞歸匹配參數(shù)

2010-03-23 10:04:00

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产一区二区三区在线观看 | 黄色网页在线观看 | 天天拍天天色 | 国产在线观看免费 | 久热中文字幕 | 中国毛片免费 | 亚洲欧美综合 | 狠狠操狠狠干 | 午夜精品在线 | 99精品视频免费观看 | 午夜私人影院 | 国产精品久久国产精品 | 自拍视频一区二区三区 | 亚洲成人网在线观看 | aaa一区| 日韩高清国产一区在线 | 亚洲福利精品 | 一级女毛片 | 成人国产精品免费观看视频 | 免费v片 | 欧美日韩不卡 | 国产精品欧美精品 | 一级电影免费看 | 成人精品久久日伦片大全免费 | 久免费视频 | 国产成人精品午夜 | 欧美精品三区 | 九七午夜剧场福利写真 | www.日韩高清 | 先锋av资源网 | 中文字幕人成乱码在线观看 | 日韩精品人成在线播放 | 亚洲男女视频在线观看 | 国产精品九九 | 日韩欧美精品在线播放 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 亚洲成人日韩 | 亚洲综合成人网 | 亚洲精品中文字幕 | 亚洲天堂中文字幕 | 日韩av第一页 |