本文已参与「新人创作礼」活动,一起开启掘金创作之路。
19.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
找了个比较好理解的
class Solution {
public:
bool isValid(string s) {
stack<char>stk;
if(s.empty()){
return true;
}
for(auto c :s){
//左括号入栈
if(c=='(' || c=='[' || c=='{'){
stk.push(c);
}
//右括号:三种情况
//1.栈为空,false
//2.与栈顶元素不匹配,false
//3.与栈顶元素匹配,true,并将栈顶元素出栈
else{
if(stk.empty()){
return false;
}
else{
if(c==')'){
if(stk.top()!='('){
return false;
}
else{
stk.pop();
}
}
else if(c==']'){
if(stk.top()!='['){
return false;
}
else{
stk.pop();
}
}
else if(c=='}'){
if(stk.top()!='{'){
return false;
}
else{
stk.pop();
}
}
}
}
}
return stk.empty();
}
};
C++map方法属实不太会,还得学
20.用栈实现队列(0)
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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(双端队列)来模拟一个栈,只要是标准的栈操作即可
class MyQueue {
public:
stack<int> stIn; //输入栈
stack<int> stOut; //输出栈
//入栈无返回,有参数
void push(int x){
stIn.push(x);//先加入输入栈
}
//出栈有返回,返回出栈的元素
int pop(){
//只有当stOut为空的时候,再从stIn里面导入全部数
if(stOut.empty()){
//从stIn导入数据直到stIn为空
while(!stIn.empty()){
stOut.push(stIn.top());
stIn.pop();
}
}
//出栈的有元素,可以出栈,临时保存栈顶
int front = stOut.top();
stOut.pop();
return front;
}
int peek(){
int res = this->pop(); //直接使用已有的pop函数
stOut.push(res); //因为pop函数弹出了元素res,所以在添加回去
return res;
}
bool empty(){
return stOut.empty()&&stIn.empty();
}
};
之后再细看吧
21.二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 **遍历
前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树