1、算法思路
转化为后缀:从左到右遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于等于当前操作符的操作符,当前操作符进栈。
转化为前缀:从右到左遍历中缀表达式,遇到操作数,输出,遇到操作符,当前操作符的优先级大于等于栈顶操作符优先级,进栈,否则,弹出栈顶优先级大于当前操作符的操作符,当前操作符进栈。--参考该网址
以上方法需要先定义操作符优先级,当然,可以定义。但是这样会麻烦许多,那么不如用括号来进行进行限定。这样就不需要写判断优先级函数了。
2、中缀表达式转后缀表达式
‘(‘,‘+‘,‘-‘,‘*‘,‘/‘入栈
‘)‘输出栈中到‘(‘的元素
其他字符直接输出
附代码:
void inTopast(char* str) //中缀到后缀 { int slen = strlen(str); //字符长度 int top = -1; //栈顶 top++; for(int i = 0; i < slen; i++) //正序 { char c = str[i]; //提取一字符 switch(c) //比较 { //'(','+','-','*','/'入栈 //')'输出栈中到'('的元素 //其他字符直接输出 case '(' : stacks[top++].s = c; break; case ')' : while(stacks[--top].s != '(') cout << stacks[top].s; break; case '+' : stacks[top++].s = c; break; case '-' : stacks[top++].s = c; break; case '*' : stacks[top++].s = c; break; case '/' : stacks[top++].s = c; break; default : cout << c; } } cout << endl; }
3、中缀表达式转前缀表达式
‘)‘,‘+‘,‘-‘,‘*‘,‘/‘入栈
‘(‘保存栈中到‘)‘的元素
其他字符直接保存
将保存的字符串逆序输出就是前缀表达式
附代码:
void inToprev(char* str) //中缀到前缀 { int slen = strlen(str); //字符长度 int top = -1; //栈顶 top++; char res[MAX_LENGTH]; int num = 0; for(int i = slen -1; i >= 0; i--) //逆序 { char c = str[i]; //提取一字符 switch(c) //比较 { //')','+','-','*','/'入栈 //'('保存栈中到')'的元素 //其他字符直接保存 case ')' : stacks[top++].s = c; break; case '(' : while(stacks[--top].s != ')') res[num++] = stacks[top].s; break; case '+' : stacks[top++].s = c; break; case '-' : stacks[top++].s = c; break; case '*' : stacks[top++].s = c; break; case '/' : stacks[top++].s = c; break; default : res[num++] = c; } } //将保存的字符串逆序输出就是前缀表达式 for(int i = num - 1; i >= 0; i--) cout << res[i]; cout << endl; }
4、源程序
#include <iostream> #include <cstring> using namespace std; int const MAX_LENGTH = 100; typedef struct { char s; }Stacks; //栈结构定义 Stacks stacks[MAX_LENGTH]; //栈 void inTopast(char* str) //中缀到后缀 { int slen = strlen(str); //字符长度 int top = -1; //栈顶 top++; for(int i = 0; i < slen; i++) //正序 { char c = str[i]; //提取一字符 switch(c) //比较 { //'(','+','-','*','/'入栈 //')'输出栈中到'('的元素 //其他字符直接输出 case '(' : stacks[top++].s = c; break; case ')' : while(stacks[--top].s != '(') cout << stacks[top].s; break; case '+' : stacks[top++].s = c; break; case '-' : stacks[top++].s = c; break; case '*' : stacks[top++].s = c; break; case '/' : stacks[top++].s = c; break; default : cout << c; } } cout << endl; } void inToprev(char* str) //中缀到前缀 { int slen = strlen(str); //字符长度 int top = -1; //栈顶 top++; char res[MAX_LENGTH]; int num = 0; for(int i = slen -1; i >= 0; i--) //逆序 { char c = str[i]; //提取一字符 switch(c) //比较 { //')','+','-','*','/'入栈 //'('保存栈中到')'的元素 //其他字符直接保存 case ')' : stacks[top++].s = c; break; case '(' : while(stacks[--top].s != ')') res[num++] = stacks[top].s; break; case '+' : stacks[top++].s = c; break; case '-' : stacks[top++].s = c; break; case '*' : stacks[top++].s = c; break; case '/' : stacks[top++].s = c; break; default : res[num++] = c; } } //将保存的字符串逆序输出就是前缀表达式 for(int i = num - 1; i >= 0; i--) cout << res[i]; cout << endl; } int main() { //测试数据 char str1[] = "((a+b)*c)"; char str2[] = "((a*(b+c))*d)"; inTopast(str1); inTopast(str2); inToprev(str1); inToprev(str2); return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-13 18:10:22