資料結構 模擬棧和佇列及運用

2021-10-08 08:08:37 字數 4106 閱讀 3472

實現乙個棧,棧初始為空,支援四種操作:

(1) 「push x」 – 向棧頂插入乙個數x;

(2) 「pop」 – 從棧頂彈出乙個數;

(3) 「empty」 – 判斷棧是否為空;

(4) 「query」 – 查詢棧頂元素。

現在要對棧進行m個操作,其中的每個操作3和操作4都要輸出相應的結果。

輸入格式

第一行包含整數m,表示操作次數。

接下來m行,每行包含乙個操作命令,操作命令為」push x」,」pop」,」empty」,」query」中的一種。

輸出格式

對於每個」empty」和」query」操作都要輸出乙個查詢結果,每個結果佔一行。

其中,」empty」操作的查詢結果為「yes」或「no」,」query」操作的查詢結果為乙個整數,表示棧頂元素的值。

資料範圍

1≤m≤100000,

1≤x≤109

所有操作保證合法。

輸入樣例:

10push 5

query

push 6

popquery

popempty

push 4

query

empty

輸出樣例:55

yes4

no程式**:

#include

using

namespace std;

const

int n =

100010

;int m, stk[n]

, tt =0;

intmain()

else

if(op ==

"pop"

) tt--

;else

if(op ==

"empty"

) cout <<

(tt >0?

"no"

:"yes"

)<< endl;

else cout << stk[tt]

<

}return0;

}

實現乙個佇列,佇列初始為空,支援四種操作:

(1) 「push x」 – 向隊尾插入乙個數x;

(2) 「pop」 – 從隊頭彈出乙個數;

(3) 「empty」 – 判斷佇列是否為空;

(4) 「query」 – 查詢隊頭元素。

現在要對佇列進行m個操作,其中的每個操作3和操作4都要輸出相應的結果。

輸入格式

第一行包含整數m,表示操作次數。

接下來m行,每行包含乙個操作命令,操作命令為」push x」,」pop」,」empty」,」query」中的一種。

輸出格式

對於每個」empty」和」query」操作都要輸出乙個查詢結果,每個結果佔一行。

其中,」empty」操作的查詢結果為「yes」或「no」,」query」操作的查詢結果為乙個整數,表示隊頭元素的值。

資料範圍

1≤m≤100000,

1≤x≤109,

所有操作保證合法。

輸入樣例:

10push 6

empty

query

popempty

push 3

push 4

popquery

push 6

輸出樣例:no6

yes4

程式**:

#include

using

namespace std;

const

int n =

100010

;int m, q[n]

, hh, tt =-1

;//hh是隊頭,tt是隊尾

intmain()

else

if(op ==

"pop"

) hh++

;else

if(op ==

"empty"

) cout <<

(hh <= tt ?

"no"

:"yes"

)<< endl;

else cout << q[hh]

<< endl;

}return0;

}

給定乙個長度為n的整數數列,輸出每個數左邊第乙個比它小的數,如果不存在則輸出-1。

輸入格式

第一行包含整數n,表示數列長度。

第二行包含n個整數,表示整數數列。

輸出格式

共一行,包含n個整數,其中第i個數表示第i個數的左邊第乙個比它小的數,如果不存在則輸出-1。

資料範圍

1≤n≤105

1≤數列中元素≤109

輸入樣例:

53 4 2 7 5

輸出樣例:

-1 3 -1 2 2

程式**:

#include

using

namespace std;

const

int n =

100010

;int n, stk[n]

, tt =0;

intmain()

return0;

}

給定乙個大小為n≤10^6的陣列。

有乙個大小為k的滑動視窗,它從陣列的最左邊移動到最右邊。

您只能在視窗中看到k個數字。

每次滑動視窗向右移動乙個位置。

以下是乙個例子:

該陣列為[1 3 -1 -3 5 3 6 7],k為3。

您的任務是確定滑動視窗位於每個位置時,視窗中的最大值和最小值。

輸入格式

輸入包含兩行。

第一行包含兩個整數n和k,分別代表陣列長度和滑動視窗的長度。

第二行有n個整數,代表陣列的具體數值。

同行資料之間用空格隔開。

輸出格式

輸出包含兩個。

第一行輸出,從左至右,每個位置滑動視窗中的最小值。

第二行輸出,從左至右,每個位置滑動視窗中的最大值。

輸入樣例:

8 31 3 -1 -3 5 3 6 7

輸出樣例:

-1 -3 -3 -3 3 3

3 3 5 5 6 7

演算法的基本思路:

如果佇列中存在兩個元素,滿足 a[i] >= a[j] 且 i < j,那麼無論在什麼時候都不會取 a[i] 作為最小值了,所以可以直接將 a[i] 刪掉;此時佇列中剩下的元素嚴格單調遞增,所以隊頭就是整個佇列中的最小值。

程式**:

#include

using

namespace std;

const

int n =

1000010

;int n, k;

int a[n]

, q[n]

;//a[n]存放資料,q[n]存放下標

intmain()

puts(""

);hh =

0, tt =-1

;for

(int i =

0; i < n; i ++

)puts(""

);return0;

}

資料結構 棧和佇列的相互模擬

利用2個棧模擬佇列 利用2個佇列模擬棧 雙棧模擬佇列 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。初始化2個棧stack1 stack2 每次入佇列總是壓入stack1棧頂 而每次出佇列總是從stack2棧頂彈出 若stack2為空則將stack1元素全部彈出壓...

資料結構 棧和佇列

棧 基礎 知識棧 練習題 佇列 基礎知識 棧示意圖 後進先出 順序棧結構定義 define maxsize 1024 struct stack 操作函式 push 入棧 pop 出棧 struct lstack 鏈棧示意圖 操作函式 push 入棧 pop 出棧 注意 也可以直接呼叫系統已經寫好的庫...

資料結構 棧和佇列

本章的基本內容是 兩種特殊的線性表 棧和佇列 從資料結構角度看,棧和佇列是操作受限的線性表,他們的邏輯結構相同。從抽象資料型別角度看,棧和佇列是兩種重要的抽象資料型別。p棧 限定僅在表的一端進行插入和刪除操作的線性表。p允許插入和刪除的一端稱為棧頂,另一端稱為棧底。p空棧 不含任何資料元素的棧。a ...