栈队
#include<bits/stdc++.h>
using namespace std;//括号匹配
string a;
int main(){
int top=0;
cin>>a;//m1
int n=a.length();
for(int i=0;i<n;i++){
if(a[i]=='{'||a[i]=='['||a[i]=='('||a[i]=='<'){
top++;
continue;//m2
}
if(a[i]=='}'||a[i]==']'||a[i]==')'||a[i]=='>'){
top--;
continue;
}
}
if(top==0){
printf("YES\n");
}
else{
printf("NO\n");
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
string s1,s2;//括号匹配检验
int main() {
cin>>s1;//string
int len=s1.length();
int j=0;
for(int i=0; i<len; i++) {
if(j==0) {
s2[++j]=s1[i];//简化
continue;
}
if(s1[i]==']'&&s2[j]=='[') {//判定
j--;
continue;
}
if(s1[i]==')'&&s2[j]=='(') {
j--;
continue;
}
if(s1[i]=='('||s1[i]=='[') {
s2[++j]=s1[i];
continue;
}
}
if(j==0) {
printf("OK\n");
} else {
printf("Wrong\n");
}
}
#include<bits/stdc++.h>
using namespace std;
int main() {
int n,m[1007];
scanf("%d",&n);
string s1;
while(n--) {
cin>>s1;
int len=s1.length();
for(int i=0; i<len; i++) {
if(s1[i]=='<') {//字符简化为数字
m[i]=1;
}
if(s1[i]=='>') {
m[i]=2;
}
if(s1[i]=='(') {
m[i]=3;
}
if(s1[i]==')') {
m[i]=4;
}
if(s1[i]=='[') {
m[i]=5;
}
if(s1[i]==']') {
m[i]=6;
}
if(s1[i]=='{') {
m[i]=7;
}
if(s1[i]=='}') {
m[i]=8;
}
}
stack<int>x;
int t=1;
for(int i=0; i<len; i++) {
if(x.empty()) {
x.push(m[i]);//记入数字
} else {
if(m[i]%2!=0) {//前括号
if(m[i]<=x.top()) {
x.push(m[i]);//记入正确顺序
} else {
t=0;
break;//错误顺序
}
} else {
if(m[i]-1==x.top()) {
x.pop();//出后括号
}
}
}
}
if(x.empty()&&t) {//处理
printf("YES\n");
} else {
if(!t||!x.empty()) {
printf("NO\n");
}
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
stack <int> s;
stack <char> dfs;
int st(char c) {//运算符简化为数字
if(c=='+'||c=='-') {
return 1;
}
if(c=='*'||c=='/') {
return 2;
}
if(c=='^') {
return 3;
}
return 0;
}
void work() {//分离且处理计算
int a=s.top();
s.pop();
int b=s.top();
s.pop();
char ch=dfs.top();
dfs.pop();
if(ch=='+') {
s.push(a + b);
} else if(ch=='-') {
s.push(b-a);
} else if(ch=='*') {
s.push(a*b);
} else if(ch=='/') {
s.push(b/a);
} else if(ch=='^') {
s.push(pow(b, a));
}
}
int main() {
string str;
cin>>str;
int len = str.length();
int x=0;
bool g=false;
for(int i=0; i<len-2; i++) {
if(st(str[i])&&st(str[i+1])) {
printf("NO");
return 0;
}
}
for (int i=0; i<len-1; i ++) {
if(str[i]>='0'&&str[i]<='9') {//数字运算符分离
x=x*10+str[i]-'0';
g=true;
} else {
if(g) {
s.push(x);
g=false;
x=0;
}
if(str[i]=='(') {
dfs.push(str[i]);//优先计算
continue;
}
if(str[i]==')') {
while(dfs.top()!='(') {
work();
}
dfs.pop();
continue;
}
while(!dfs.empty()&&st(dfs.top())>=st(str[i])) {
work();
}
dfs.push(str[i]);
}
}
if(g) {
s.push(x);
}
while(!dfs.empty()) {
work();
}
printf("%d\n",s.top());
return 0;
}
判断合法性
运算符号与数字相间
前数字或负号
后数字
有待简化