例题一:括号匹配问题
解题思路
#include<stdio.h>
#include<stack>
using namespace std;
stack<int> s;//定义一个堆栈
char str[110];//保存输入字符串
char ans[110];//保存输出字符串
int main(){
while(scanf("%s",str)!=EOF){
int i;
for(i=0;str[i]!=0;i++){
if(str[i]=='('){
s.push(i);
ans[i]=' ';
}
else if(str[i]==')'){
if(s.empty()==false){
s.pop();
ans[i]=' ';
}
else ans[i]='?';
}
else ans[i]=' ';
}
while(!s.empty()){
ans[s.top()]='$';
s.pop();
}
ans[i]=0;
puts(str);
puts(ans);
}
return 0;
}
例题二:
#include<stack>
#include<stdio.h>
using namespace std;
char str[220];
int mat[][5]={
1,0,0,0,0,
1,0,0,0,0,
1,0,0,0,0,
1,1,1,0,0,
1,1,1,0,0,
};
//优先级矩阵 若mat[i][j]==1表示i号运算符优先级大于j
//+为1号 -为2号 *为3号 /为4号
//我们人为添加在表达式首尾的标记运算符为0号
stack<int> op;//运算符栈
stack<double> in;//数字栈
void getop(bool &reto,int &retn,int &i){
//获得表达式中下一个元素
//若reto为true 表示该元素为一个运算符 其编号保存在retn中
// 若reto为false 表示该元素是一个数字 其值保存在retn中
//i表示遍历到的字符串下标
if(i==0&&op.empty()==true){
//若此时遍历字符串第一个字符且运算栈为空 人为添加编号为0的标识字符
reto=true;
retn=0;
return;
}
if(str[i]==0){//此时字符串已被遍历完
reto=true;
retn=0;
return;
}
if(str[i]>='0'&&str[i]<='9'){
reto=false;
}
else{
reto=true;
if(str[i]=='+'){
retn=1;
}
else if(str[i]=='-'){
retn=2;
}
else if(str[i]=='*'){
retn=3;
}
else if(str[i]=='/'){
retn=4;
}
i+=2;
return;
}
retn=0;
for(;str[i]!=' '&&str[i]!=0;i++){
retn*=10;
retn+=str[i]-'0';
}
if(str[i]==' ')
i++;
return;
}
int main(){
while(gets(str)){
if(str[0]=='0'&&str[1]==0) break;
bool retop;int retnum;
int idx=0;
while(!op.empty()) op.pop();
while(!in.empty()) in.pop();
while(true){
getop(retop,retnum,idx);
if(retop==false){
in.push((double) retnum);
}
else{
double tmp;
if(op.empty()==true||mat[retnum][op.top()]==1)
op.push(retnum);
else
{
while(mat[retnum][op.top()]==0){
int ret=op.top();
op.pop();
double b=in.top();
in.pop();
double a=in.top();
in.pop();
if(ret==1) tmp=a+b;
else if(ret==2) tmp=a-b;
else if(ret==3) tmp=a*b;
else tmp=a/b;
in.push(tmp);
}
op.push(retnum);
}
}
if(op.size()==2&&op.top()==0) break;
}
printf("%.2f\n",in.top());
}
}