資料結構 LeetCode 232 用棧實現佇列
阿新 • • 發佈:2022-04-17
232.用棧實現佇列
一、一開始沒想到好的做法,就用了三個棧去做到輸入輸出
程式碼:
1 class MyQueue { 2 public: 3 stack<int>a; 4 MyQueue() { 5 6 } 7 8 void push(int x) { 9 a.push(x); 10 11 } 12 13 int pop() { 14 stack<int>b; 15 stack<int>temp = a; 16 while(!temp.empty()) 17 { 18 b.push(temp.top()); 19 temp.pop(); 20 } 21 int ans = b.top(); 22 b.pop(); 23 while (!b.empty()) 24 { 25 temp.push(b.top()); 26 b.pop(); 27 } 28 a = temp; 29 returnans; 30 } 31 32 int peek() { 33 stack<int>b; 34 stack<int>temp=a; 35 while (!temp.empty()) 36 { 37 b.push(temp.top()); 38 temp.pop(); 39 } 40 return b.top(); 41 42 } 43 44 bool empty() {45 return a.empty(); 46 } 47 };
也AC了,時間複雜度也很低,只是多用了一個棧。
二、
後面發現直接兩個棧,一個in棧存進來的,一個out棧存要出去的,每次有執行pop指令就從出out棧出去,如果out棧為空,就把in棧的元素都pop到out,所以一共有n個元素,總的也只是把n個元素從inpop到out,總的時間複雜度應該是n,也滿足了題目的進階要求:
我的AC程式碼:
class MyQueue { public: stack<int>in; stack<int>out; MyQueue() { } void push(int x) { in.push(x); } int pop() { int ans; if (!out.empty()) { ans = out.top(); out.pop(); } else { while (!in.empty()) { out.push(in.top()); in.pop(); } ans = out.top(); out.pop(); } return ans; } int peek() { int ans; if (!out.empty()) { ans = out.top(); } else { while (!in.empty()) { out.push(in.top()); in.pop(); } ans = out.top(); } return ans; } bool empty() { if (in.empty() && out.empty()) return true; else return false; } };