括号匹配(AcWing 3693)
#include<iostream>
#include<stack>
#include<string>
using namespace std;
const int N=10010;
char op[N];
//练习栈的基本操作
//以及栈的STL方法
int main(){
scanf("%s",op);
stack<char> stk;
char t;
for(int i=0;op[i];i++){
if(op[i]=='<' || op[i]=='(' || op[i]=='{' || op[i]=='['){
stk.push(op[i]);
}else{
//注意这里的判断是否为空 因为要弹出来括号
if(stk.size()==0){
cout << "no" << endl;
return 0;
}
if((op[i]=='>' && stk.top()=='<') || (op[i]==')'&& stk.top()=='(') || (op[i]=='}' && stk.top()=='{') || (op[i]==']' && stk.top()=='[' )){
stk.pop();
}else{
cout << "no" <<endl;
return 0;
}
}
}
//需要判断栈是否为空
if(stk.empty()) cout << "yes";
else cout << "no";
return 0;
}
表达式求值(Acwing 3302)
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
#include <unordered_map>
using namespace std;
stack<int> num;//存放操作数的值
stack<char> op;//存放运算符的值
//从num中取出两个操作数,从op中取出一个操作符运算后重新放入栈中
void eval()
{
auto b = num.top(); num.pop();
auto a = num.top(); num.pop();
auto c = op.top(); op.pop();
int x;
if (c == '+') x = a + b;
else if (c == '-') x = a - b;
else if (c == '*') x = a * b;
else x = a / b;
num.push(x);
}
int main()
{
unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};//设置运算符的优先级
string str;
cin >> str;
for (int i = 0; i < str.size(); i ++ )
{
auto c = str[i];
//如果是操作数的话就需要转化程序成相应的整数
if (isdigit(c))
{
int x = 0, j = i;
while (j < str.size() && isdigit(str[j]))
x = x * 10 + str[j ++ ] - '0';
i = j - 1;//注意这里i指针要跟着移动到这里
num.push(x);
}
//如果是左括号的话就先放入到栈中
else if (c == '(') op.push(c);
//如果是右括号的话就要先把括号里面的值计算出来,一直计算到左括号
else if (c == ')')
{
while (op.top() != '(') eval();
op.pop();
}
//如果输入的是运算符,且当前op中不为空,且前一个字符不是'('
//则需要与前栈顶的运算符进行比较,如果栈顶运算符优先级比较高,则需要先计算栈顶运算符
else
{
while (op.size() && op.top() != '(' && pr[op.top()] >= pr[c]) eval();
op.push(c);
}
}
//在处理完运算符优先级还有括号等问题后,还会有一些遗留,直接从右向左计算即可
while (op.size()) eval();
cout << num.top() << endl;
return 0;
}