多网合一网站,万网买的网站备案,视频弹幕网站怎么做的,眉山市住房和城乡建设部网站20. 有效的括号
题目
给定一个只包括 (#xff0c;)#xff0c;{#xff0c;}#xff0c;[#xff0c;] 的字符串 s #xff0c;判断字符串是否有效。
有效字符串需满足#xff1a;
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一…20. 有效的括号
题目
给定一个只包括 (){}[] 的字符串 s 判断字符串是否有效。
有效字符串需满足
左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。
思路
用栈来匹配是最好的选择将字符串的每个字符与栈顶元素匹配如果栈为空或者不匹配就将字符进栈每次匹配成功就可以将栈顶元素弹出如果字符串有效那么栈里最后是不会有元素的。
代码
class Solution {
public:bool isValid(string s) {stackchar st;if (s.size() % 2)return false;for (int i 0; i s.size(); i) {if (st.empty()) {st.push(s[i]);continue;}if (s[i] ( || s[i] { || s[i] [) {st.push(s[i]);}else if ((s[i] ) st.top() () || (s[i] } st.top() {) || (s[i] ] st.top() [)) {st.pop();}else {st.push(s[i]);}}if (st.empty())return true;elsereturn false;}
};
1047. 删除字符串中的所有相邻重复项
题目 思路
和上一题一样只不过这题要注意最后留下的字符串是要输出的所以我们一开始遍历原字符串时就要从最后一个遍历这样塞进栈里的字符串顺序是反的最后再把栈里的字符串输出到一个新定义的字符串即可注意定义字符串的格式是 string str(length, ) 括号中前一个参数是字符串的长度后一个是用什么字符填充这个字符串。
代码
class Solution {
public:string removeDuplicates(string s) {stackint st;int len 0;for (int i s.size() - 1; i 0; i--) {if (st.empty()) {st.push(s[i]);len;}else if (s[i] st.top()) {st.pop();len--;}else {st.push(s[i]);len;}}string ss(len, );int k 0;while (len--) {ss[k] st.top();st.pop();k;}return ss;}
};
150. 逆波兰表达式求值
题目
给你一个字符串数组 tokens 表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意
有效的算符为 、-、* 和 / 。每个操作数运算对象都可以是一个整数或者另一个表达式。两个整数之间的除法总是 向零截断 。表达式中不含除零运算。输入是一个根据逆波兰表示法表示的算术表达式。答案及所有中间计算结果可以用 32 位 整数表示。 思路
理解了逆波兰式的输入就很好办了和上面两题异曲同工而且这道题不会有需要特判的情况所以只需要遇到符号就取栈顶元素计算即可唯一要注意的是这里面的数据类型转换把string类型变成int型用stoll。
代码
class Solution {
public:int evalRPN(vectorstring tokens) {stacklong long st;for (int i 0; i tokens.size(); i) {if (tokens[i] || tokens[i] - || tokens[i] * || tokens[i] /) {int num2 st.top();st.pop();int num1 st.top();st.pop();if (tokens[i] ) st.push(num1 num2);if (tokens[i] -) st.push(num1 - num2);if (tokens[i] *) st.push(num1 * num2);if (tokens[i] /) st.push(num1 / num2);}else {st.push(stoll(tokens[i]));}}int result st.top();st.pop();return result;}
};