中缀表达式到前缀表达式和后缀表达式
2015-08-10 12:17
381 查看
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;
}
相关文章推荐
- 在卸载或更改程序中不显示已安装程序的方法
- 我所认为的重点
- 验证数字的正则表达式集
- Windows离线安装.NET3.X
- 验证数字的正则表达式集
- swirl 8: Logic
- 111. Minimum Depth of Binary Tree
- Codeforces 567E President and Roads (最短路 好题)
- 关于android隐藏标题和状态栏,实测完美!
- C++_引用与const
- Java 二分法查找
- Zero Downtime Upgrade of Oracle 10g to Oracle 11g Using GoldenGate — 3
- Java 快速排序 快排
- Python 下 sqlite 使用
- [转]如何调整压力测试工具
- HDU 2084 以数字三角形谈论递归
- apache配置详解
- ExecutorService生命周期,,shutdownNow方法:这个方法会强制关闭ExecutorService,它将取消所有
- 那些年我看过的书
- poj_1442 Treap