填空题和选择题用到的方法---链接第三章 栈和队列
中缀转后缀
核心思想就是数字直接进入输出栈,遇到运算符则先比较优先级大小或者栈内无元素或只有左括号即可直接进入运算符栈,再运算符中碰到右括号则直接弹出所有运算符至输出栈
#include <stdio.h>
int getPriority(char op){
if (op=='+' || op=='-') return 0;
else return 1;
}
void change(char a[], char s2[2]){
char s1[20];
int top1=-1, top2=-1, i=0;
while (a[i] != '\0'){
if ('0'<=a[i] && a[i]<='9'){ //数字进输出栈
s2[++top2] = a[i];
++i;
}else if (a[i] == '('){ //左括号直接放入运算栈,待下次判断右括号
s1[++top1] = a[i];
++i;
}else if (a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]=='/'){ //判断运算符
if (top1==-1 || s1[top1]=='(' || getPriority(a[i]) > getPriority(s1[top1])){
s1[++top1] = a[i]; //运算符栈为空、左括号、优先级比栈内元素大 都可直接入运算栈
++i;
}else s2[++top2] = s1[top1--]; //否则放入输出栈
}else if (a[i] == ')'){ //左括号直接全部放入输出栈
while (s1[top1] != '(')
s2[++top2] = s1[top1--];
--top1; //弹出'('
++i;
}
}
while (top1 != -1){
s2[++top2] = s1[top1--];
}
}
int main(){
char a[10] = {'(', '3', '+', '4', ')', '+', '5'};
char b[10];
change(a,b);
for (int i=0;i<5;i++)
printf("%c", b[i]);
return 1;
}
中缀转前缀
除了左右括号互换,i改为len-1,>改为>=即可。代码还未测试,亲自试一试吧
int getPriority(char op){
if (op=='+' || op=='-') return 0;
else return 1;
}
void change(char a[], char s2[2], int len){
char s1[20];
int top1=-1, top2=-1, i=len-1; // 此处不同上面
while (a[i] != '\0'){
if ('0'<=a[i] && a[i]<='9'){ //数字进输出栈
s2[++top2] = a[i];
--i;
}else if (a[i] == ')'){
s1[++top1] = a[i];
--i;
}else if (a[i]=='+' || a[i]=='-' || a[i]=='*' || a[i]=='/'){ //判断运算符
if (top1==-1 || s1[top1]==')' || getPriority(a[i]) >= getPriority(s1[top1])){
s1[++top1] = a[i]; //注意是>=
--i;
}else s2[++top2] = s1[top1--]; //否则放入输出栈
}else if (a[i] == '('){
while (s1[top1] != ')')
s2[++top2] = s1[top1--];
--top1; //弹出'('
--i;
}
}
while (top1 != -1){
s2[++top2] = s1[top1--];
}
}