day9-栈/队列
1、有效的括号
-
描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 示例 1: 输入:s = "()" 输出:true 示例 2: 输入:s = "()[]{}" 输出:true 示例 3: 输入:s = "(]" 输出:false 提示: 1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成
-
思路
将左括号压入栈
遇到右括号比较top是否匹配
-
代码
#include <iostream> using namespace std; #include <string> #include <stack> class Solution { public: bool isValid(string s) { stack<char> chars; for(int i = 0; i < s.size(); i++) { printf("cur char : %c \n " ,s[i]); if(!chars.empty()) printf("minus cur %c , top : %c : minus : %d \n",s[i],chars.top(),(s[i] - chars.top())); switch (s[i]) { case '(': case '[': case '{': chars.push(s[i]); printf("after push: %c \n " ,chars.top()); break; case ')': if(chars.empty() || chars.top() != '(') return false; chars.pop(); break; case ']': if(chars.empty() || chars.top() != '[') return false; chars.pop(); break; case '}': if(chars.empty() || chars.top() != '{') return false; chars.pop(); break; default: return false; break; } } if(!chars.empty()) return false; return true; } }; int main() { string s = "["; Solution sol; cout << sol.isValid(s) << endl; return 0; }
2、用栈实现队列
-
描述
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false 说明: 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。 示例 1: 输入: ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] 输出: [null, null, null, 1, 1, false] 解释: MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false 提示: 1 <= x <= 9 最多调用 100 次 push、pop、peek 和 empty 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作) 进阶: 你能否实现每个操作均摊时间复杂度为 O(1) 的队列?换句话说,执行 n 个操作的总时间复杂度为 O(n) ,即使其中一个操作可能花费较长时间。
-
思路
stack先进后出,list后进先出
push输入数据时,先将所有数据都弹出存入另一个stack。将数据压入后再将所有数据压回原有栈
原有栈维持在先进先出状态
-
代码
#include <iostream> using namespace std; #include <vector> #include <stack> class MyQueue { private: stack<int> vals; public: MyQueue() { printf("MyQueue -> "); } void push(int x) { stack<int> tmp; while(!vals.empty()) { tmp.push(vals.top()); vals.pop(); } vals.push(x); while(!tmp.empty()) { vals.push(tmp.top()); tmp.pop(); } printf("push %d -> ",x); } int pop() { int num = vals.top(); vals.pop(); printf("pop %d -> ",num); return num; } int peek() { int num = vals.top(); printf("peek %d -> ",num); return num; } bool empty() { printf("empty %d -> ",vals.empty()); return vals.empty(); } }; void option(vector<string> ops,vector<vector<int>> val) { MyQueue *queue; for(int i = 0; i < ops.size(); i++) { // printf("%c\n",ops[i].c_str()); // printf("cur op %c val == MyQueue? %d\n",ops[i].c_str(),ops[i].compare("MyQueue")); if(!ops[i].compare("MyQueue")) queue = new MyQueue; else if (!ops[i].compare("push")) queue->push(val[i][0]); else if (!ops[i].compare("peek")) queue->peek(); else if (!ops[i].compare("pop")) queue->pop(); else if (!ops[i].compare("empty")) queue->empty(); } } int main() { vector<string> ops = {"MyQueue", "push", "push", "peek", "pop", "empty"}; vector<vector<int>> val = {{}, {1}, {2}, {}, {}, {}}; option(ops,val); return 0; }