程式碼隨想錄演算法訓練營第十一天|232.用棧實現佇列、225.用佇列實現棧、20.有效的括號、1047.刪除字串中的所有相鄰重複項

清源风起时發表於2024-07-04
232和225題一個思路 一起貼了
 1 class MyQueue {
 2 public:
 3     MyQueue() {
 4         stack<int> in;
 5         stack<int> out;
 6     }
 7     
 8     void push(int x) {
 9         in.push(x);
10     }
11     
12     int pop() {
13         while (!in.empty()) {
14             out.push(in.top());
15             in.pop();
16         }
17         int ans = out.top();
18         out.pop();
19         while (!out.empty()) {
20             in.push(out.top());
21             out.pop();
22         }
23         return ans;
24     }
25     
26     int peek() {
27         while (!in.empty()) {
28             out.push(in.top());
29             in.pop();
30         }
31         int ans = out.top();
32         while (!out.empty()) {
33             in.push(out.top());
34             out.pop();
35         }
36         return ans;
37     }
38     
39     bool empty() {
40         if (in.empty()) {
41             return true;
42         }
43         return false;
44     }
45 private:
46     stack<int> in;
47     stack<int> out;
48 
49 };
 1 class MyStack {
 2 public:
 3     MyStack() {
 4         
 5     }
 6     
 7     void push(int x) {
 8         // 先將 x 入隊到 queue2 中
 9         q2.push(x);
10         
11         // 將 queue1 中的所有元素依次轉移到 queue2 中,確保 queue2 中的元素順序是棧順序
12         while (!q1.empty()) {
13             q2.push(q1.front());
14             q1.pop();
15         }
16         
17         // 交換 queue1 和 queue2,使得 queue1 始終是主要儲存棧元素的佇列
18         std::swap(q1, q2);
19     }
20     
21     int pop() {
22         // 直接從 queue1 中彈出棧頂元素
23         int top_elem = q1.front();
24         q1.pop();
25         return top_elem;
26     }
27     
28     int top() {
29         // 返回 queue1 的隊首元素,即棧頂元素
30         return q1.front();
31     }
32     
33     bool empty() {
34         // 判斷 queue1 是否為空
35         return q1.empty();
36     }
37 
38 private:
39     std::queue<int> q1;
40     std::queue<int> q2;
41 };

20題就是簡單的符號匹配

 1 class Solution {
 2 private:
 3     vector<char>Stack;
 4 public:
 5     bool isValid(string s) {
 6         for(int i=0;i<s.size();i++){
 7             if(s[i]=='('){
 8                 Stack.push_back('(');
 9             }
10             else if(s[i]==')'){
11                 if(Stack.empty()){
12                     return false;
13                 }
14                 if(Stack.back()!='('){
15                     return false;
16                 }
17                 Stack.pop_back();
18             }
19             else if(s[i]=='['){
20                 Stack.push_back('[');
21             }
22             else if(s[i]==']'){
23                 if(Stack.empty()){
24                     return false;
25                 }
26                 if(Stack.back()!='['){
27                     return false;
28                 }
29                 Stack.pop_back();
30             }
31             else if(s[i]=='{'){
32                 Stack.push_back('{');
33             }
34             else if(s[i]=='}'){
35                 if(Stack.empty()){
36                     return false;
37                 }
38                 if(Stack.back()!='{'){
39                     return false;
40                 }
41                 Stack.pop_back();
42             }
43         }
44         if(Stack.size()!=0){
45             return false;
46         }
47         return true;
48     }
49 };

1047題倒是有點意思 但是我想多了 額外做了一個去重的操作 太呆了 其實也就是變種的符號匹配

 1 // //變種的符號匹配
 2 // class Solution {
 3 // public:
 4 //     string removeDuplicates(string s) {
 5 //         // 定義兩個棧 tmp1 和 tmp2
 6 //         stack<char> tmp1;
 7 //         stack<char> tmp2;
 8 //         int len = s.size(); // 獲取字串 s 的長度
 9 //         int i = 0; // 初始化索引 i
10 //         bool flag; // 定義一個標誌位用於控制內層迴圈
11 
12 //         // 外層迴圈遍歷字串 s
13 //         while (i < len) {
14 //             // 如果 tmp1 不為空且當前字元 s[i] 與 tmp1 的棧頂元素相同
15 //             if (!tmp1.empty() && s[i] == tmp1.top()) {
16 //                 tmp1.pop(); // 彈出 tmp1 的棧頂元素
17 //                 i++; // 繼續處理下一個字元
18 //                 flag = true; // 將標誌位設定為 true
19 
20 //                 // 內層迴圈處理 tmp1 中相鄰且相同的元素
21 //                 while (flag && !tmp1.empty()) {
22 //                     tmp2.push(tmp1.top()); // 將 tmp1 的棧頂元素推入 tmp2
23 //                     tmp1.pop(); // 彈出 tmp1 的棧頂元素
24 
25 //                     // 如果 tmp2 的棧頂元素和 tmp1 的新棧頂元素相同
26 //                     if (!tmp1.empty() && tmp2.top() == tmp1.top()) {
27 //                         tmp1.pop(); // 彈出 tmp1 的棧頂元素
28 //                         tmp2.pop(); // 彈出 tmp2 的棧頂元素
29 //                         flag = true; // 繼續檢查下一個元素
30 //                     } else {
31 //                         // 如果不相同,則將 tmp2 的棧頂元素重新推回 tmp1
32 //                         tmp1.push(tmp2.top());
33 //                         tmp2.pop();
34 //                         flag = false; // 結束內層迴圈
35 //                     }
36 //                 }
37 //             }
38 //             // 如果 tmp1 為空或者當前字元 s[i] 與 tmp1 的棧頂元素不同
39 //             else if (tmp1.empty() || s[i] != tmp1.top()) {
40 //                 tmp1.push(s[i]); // 將當前字元推入 tmp1
41 //                 i++; // 繼續處理下一個字元
42 //             }
43 //         }
44 
45 //         // 將 tmp1 中的所有元素依次彈出,壓入 tmp2,逆轉順序
46 //         while (!tmp1.empty()) {
47 //             tmp2.push(tmp1.top());
48 //             tmp1.pop();
49 //         }
50 
51 //         // 構建結果字串
52 //         string result;
53 //         while (!tmp2.empty()) {
54 //             result += tmp2.top(); // 將 tmp2 的棧頂元素新增到結果字串
55 //             tmp2.pop();
56 //         }
57 
58 //         // 返回最終的結果字串
59 //         return result;
60 //     }
61 // };
62 class Solution {
63 public:
64     string removeDuplicates(string s) {
65         stack<char> tmp; // 定義一個棧 tmp
66         
67         for (char c : s) { // 遍歷字串 s
68             if (!tmp.empty() && tmp.top() == c) {
69                 tmp.pop(); // 如果當前字元與棧頂元素相等,則彈出棧頂元素
70             } else {
71                 tmp.push(c); // 否則將當前字元壓入棧中
72             }
73         }
74         
75         // 構建結果字串
76         string result;
77         while (!tmp.empty()) {
78             result += tmp.top(); // 將棧頂元素新增到結果字串
79             tmp.pop(); // 彈出棧頂元素
80         }
81         
82         // 因為棧是先進後出,所以需要反轉字串
83         reverse(result.begin(), result.end());
84         
85         return result; // 返回最終的結果字串
86     }
87 };

相關文章