1.括号匹配
算法思路:从左往右依次扫描括号串,如果遇到左括号串如 (, [ ,{ ,将它们入栈,如果遇到右括号串如 ) , ], } , 则从栈中出栈一个左括号,并检测是否于该右括号匹配。该思路有三种不匹配的情况,一是括号不匹配,二是扫到右括号时左括号栈已经为空,三是整个字符串扫描完毕后,左括号栈中依然还有左括号未出栈。如果以上三种情况都不满足,则说明该括号串是匹配的
#include<iostream>
#include<string>
#include<cstdio>
#include<stack>
using namespace std;
stack<char> sc;
bool judge(string s) {
for (int i = 0; i < (int) s.size(); i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
sc.push(s[i]);
} else {
if (sc.empty())return false;
char elem = sc.top();
sc.pop();
if (s[i] == ')' && elem != '(')return false;
if (s[i] == ']' && elem != '[')return false;
if (s[i] == '}' && elem != '{')return false;
}
}
return sc.empty();
}
int main(){
string str;
while(cin>>str){
if(judge(str)) {
cout<<"success"<<endl;
}else {
cout<<"failed"<<endl;
}
}
return 0;
}
2. 计算后缀表达式
#include<bits/stdc++.h>
using namespace std;
stack<int> si;
int main(){
string s;
while(cin>>s) {
for(int i = 0;i<(int)s.size();i++){
if(s[i]>='0'&& s[i]<='9'){
si.push(s[i]-'0');
}
else if(s[i]=='+'){
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = x + y;
si.push(sum);
}
else if(s[i]=='-') {
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = y - x;
si.push(sum);
}
else if(s[i]=='*') {
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = x * y;
si.push(sum);
}
else if(s[i]=='/') {
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = y / x;
si.push(sum);
}
}
cout<<si.top()<<endl;
}
return 0;
}
3.中缀表达式转为后缀表达式
注意这里是以A和B代替两个操作数,输入的中缀表达式形如A+B等
#include<bits/stdc++.h>
using namespace std;
stack<char> st;
map<char,int> mp;
int main(){
mp['+'] = mp['-'] = 1;
mp['*'] = mp['/'] = 2;
string s;
string str;
while(cin>>s){
str = "";
for(int i = 0;i<(int)s.size();i++){
if(s[i]>='A'&&s[i]<='Z'){
str+=s[i];
}
else if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'){
while(!st.empty()&&mp[st.top()]>=mp[s[i]]){
str+=st.top();
st.pop();
}
st.push(s[i]);
}
else if(s[i]=='('){
st.push(s[i]);
}
else if(s[i]==')'){
while(st.top()!='('){
str+=st.top();
st.pop();
}
st.pop();
}
}
while(!st.empty()){
str+=st.top();
st.pop();
}
cout<<str<<endl;
}
return 0;
}
4. 中缀表达式的计算
中缀表达式的计算可以理解为中缀表达式转为后缀表达式的算法和后缀表达式计算的算法的结合,中缀表达式匹配人类的认知,适合手算,而对于计算机更适合计算后缀表达式
#include<bits/stdc++.h>
using namespace std;
stack<char> sc;
stack<int> si;
map<char,int> mp;
void calc(char c){
if(c=='+'){
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = x + y;
si.push(sum);
}
else if(c=='-'){
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = y - x;
si.push(sum);
}
else if(c=='*'){
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = y * x;
si.push(sum);
}
else if(c=='/'){
int x = si.top();
si.pop();
int y = si.top();
si.pop();
int sum = y / x;
si.push(sum);
}
}
int main() {
mp['+'] = mp['-'] = 1;
mp['*'] = mp['/'] = 2;
string s;
while (cin >> s) {
for (int i = 0; i < (int) s.size(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
si.push(s[i] - '0');
}
else if (s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/') {
while (!sc.empty() && mp[sc.top()] >= mp[s[i]]) {
calc(sc.top());
sc.pop();
}
sc.push(s[i]);
}
else if(s[i]=='('){
sc.push(s[i]);
}
else if(s[i]==')'){
if(sc.top()!='('){
calc(sc.top());
sc.pop();
}
sc.pop();
}
}
while(!sc.empty()){
calc(sc.top());
sc.pop();
}
cout<<si.top()<<endl;
}
return 0;
}
|