LeetCode 棧與佇列

2021-10-19 08:10:37 字數 3101 閱讀 1412

用乙個佇列就可以實現棧

取元素時要把佇列尾元素取出(最後進入佇列的元素)

把前n-1個元素放到佇列尾並彈出,這樣佇列的頭部就是最後進入佇列的元素了,取出他即可

class

mystack

void

push

(int x)

intpop()

int res = que.

front()

; que.

pop();

return res;

}int

top(

)bool

empty()

};

需要把棧最裡面的元素取出來,不能像佇列那樣操作了,那樣最裡面的元素依舊在最裡面

用兩個棧,把1棧所有元素取出放到2棧中,此時2棧中所有元素出棧順序為佇列順序,直接取出元素即可

注意只有當棧2位空時才補充元素到棧2,否則會影響出棧順序

class

myqueue

void

push

(int x)

intpop()

}int res = stk2.

top();

stk2.

pop();

return res;

}int

peek()

}return stk2.

top();

}bool

empty()

};

方法一:

相當於單調棧,棧中只放左括號,遇到右括號彈出乙個左括號,用是否棧空判斷括號是否完全

要在新增之前,刪除之後,判斷站是否為空,來判斷是否為中間元素

string removeouterparentheses

(string s)if(

!stk.

empty()

)if(s[i]

=='(')}

return res;

}

方法二:

原理相同,改用變數記錄左括號個數,節省空間

string removeouterparentheses

(string s)

if(count !=0)

if(s[i]

=='(')}

return res;

}

模擬棧節省空間,原地修改,指標指向當前最後乙個元素,與前乙個元素不相同就加入,相同就退格(刪除),最後重新設定字串大小

也可以新建立乙個字串,用push_back(),pop_back()模擬棧

string removeduplicates

(string s)

else

} s.

resize

(index)

;return s;

}

-1,1,1 當-1不退棧時,最小值永遠是-1

方法一:

用輔助棧,輔助棧頂存放當前最小值,輔助棧與棧同時退棧

如-1,-1,-2,1輔助棧存放為,-1,-1,-2,-2

入棧時當前值小於輔助棧頂時更換元素

也可以用stack> 型別

class

minstack

else

stk.

push

(x);

}void

pop(

)int

top(

)int

getmin()

};

方法二:

只用乙個棧,棧中儲存與最小值的差值,min儲存當前最小值

要用long儲存,棧中元素最大為int_max - int_min

top,元素為負數時,返回當前最小值(此時差值用於計算出上乙個min),為負數時當前min就是他的值

push、pop,當元素為負數時更換最小值

class

minstack

stk.

push

(x - min);if

(x < min)

}void

pop(

) stk.

pop();

}int

top(

)int

getmin()

};

單調棧:用於找陣列中第乙個比他大的資料(單調遞減棧,留在棧中的都是後來沒有比他的數了)

棧中存放的是索引,因為只知道資料大小是沒辦法準確插入到相應位置的

vector<

int>

nextlargernodes

(listnode* head)

vector<

int>

res(n,0)

;for

(int i =

0; i < nums.

size()

; i++

) stk.

push

(i);

}return res;

}

本題優化,用res陣列兼職nums和res陣列的功能,因為只使用之前的資料且res資料記錄答案後就不再使用了,所以邊記錄邊比較同時可以直接覆蓋

由於預設值沒有設定,所以再遍歷一遍棧,將棧中剩餘元素置為0(剩餘元素都是右邊沒有更大值了,即遞減的)

vector<

int>

nextlargernodes

(listnode* head)

res.

push_back

(head-

>val)

; stk.

push

(i++);

head = head-

>next;

}while

(!stk.

empty()

)return res;

}

一般可以用模擬棧的方式節省空間

找第乙個比當前元素大/小的數就用單調棧做

Leetcode記錄 棧與佇列

想到未來如果換工作 run出去找工作也需要演算法 計畫跟著 隨想錄開始刷題,但是解題過程中發現 隨想錄主要用c j a的 沒有特別的友好,於是記錄下自己做不出的題目以及微調過的 隨想錄題解 class solution else if c else if c else if c else if c ...

leetcode 棧和佇列

20.有效的括號 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false ...

LeetCode棧和佇列

棧和佇列 棧是限定僅在表尾進行插入和刪除操作的後進先出 lifo 的線性表 佇列是只允許在表的一端進行插入,在另一端刪除元素的先進先出 fifo 的線性表 225.用佇列實現棧 使用佇列實現棧的下列操作 注意 思路 為了滿足棧的特性,即最 棧的元素最先出棧,在使用佇列實現棧時,應滿足佇列前端的元素是...