中缀表达式转后缀表达式(逆波兰表达式)
来源:互联网 发布:什么英语听力软件最好 编辑:程序博客网 时间:2024/06/05 02:36
#include<iostream>
int main(){
int op_top=-1;
int data_top=-1;
double data[100]={0};
char optr[100]={0};
char nibolan[300];//逆波兰的字符串
int NL=-1;//用于记录逆波兰的下标
char a[]="3.0*(4.0+2.0)/2.0-5.0";//中缀表达式
printf("%d\n",sizeof(a));
int flag=1;//标记是不是负号
for(int i=0;i<sizeof(a)-1;i++){// 遍历字符串转化为逆波兰
switch(a[i]){
case '(':
printf("%c\n",a[i]);
op_top++;
optr[op_top]=a[i];
flag=1;
break;
case ')':
printf("%c\n",a[i]);
if(op_top!=-1){
while(optr[op_top]!='('){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
}
op_top--;
flag=0;
break;
case '+':
case '-':
printf("%c\n",a[i]);
if(flag==1){
if(a[i]=='-'){
op_top++;
optr[op_top]='@';
}
break;
}
while(op_top!=-1&&optr[op_top]!='('){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
op_top++;
optr[op_top]=a[i];
flag=0;
break;
case '*':
case '/':
printf("%c\n",a[i]);
if(op_top!=-1){
while(optr[op_top]=='*'||optr[op_top]=='/'){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
}
op_top++;
optr[op_top]=a[i];
flag=0;
break;
default:
printf("%c\n",a[i]);
if(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
while(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
}
if(a[i]=='.'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
while(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
}
}
}
i--;
NL++;
nibolan[NL]='#';
flag=0;
break;
}
}
while(op_top!=-1){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
for(i=0;i<=NL;i++){
printf("%c",nibolan[i]);
}
printf("\n");
printf("%d\n",NL);
double d=0;
double x=0.1;
for(i=0;i<=NL;i++){
switch(nibolan[i]){
case '+':
data[data_top-1]=data[data_top-1]+data[data_top];
data_top--;
break;
case '-':
data[data_top-1]=data[data_top-1]-data[data_top];
data_top--;
break;
case '*':
data[data_top-1]=data[data_top-1]*data[data_top];
data_top--;
break;
case '/':
if(data[data_top]==0){
printf("表达式有错误,除数不能为零\n");
}else{
data[data_top-1]=data[data_top-1]/data[data_top];
data_top--;
}
break;
case '@':
data[data_top]=-(data[data_top]);
break;
default:
d=0;
while(nibolan[i]>='0'&&nibolan[i]<='9'){
d=d*10+(nibolan[i]-'0');
i++;
}
x=0.1;
if(nibolan[i]=='.'){
i++;
while(nibolan[i]>='0'&&nibolan[i]<='9'){
d=d+x*(nibolan[i]-'0');
x=x*x;
i++;//这时候是‘#’,跳过
}
}
data_top++;
data[data_top]=d;
break;
}
}
double result=data[data_top];
printf("表达式的结果是:%lf\n",result);
return 0;
}
int main(){
int op_top=-1;
int data_top=-1;
double data[100]={0};
char optr[100]={0};
char nibolan[300];//逆波兰的字符串
int NL=-1;//用于记录逆波兰的下标
char a[]="3.0*(4.0+2.0)/2.0-5.0";//中缀表达式
printf("%d\n",sizeof(a));
int flag=1;//标记是不是负号
for(int i=0;i<sizeof(a)-1;i++){// 遍历字符串转化为逆波兰
switch(a[i]){
case '(':
printf("%c\n",a[i]);
op_top++;
optr[op_top]=a[i];
flag=1;
break;
case ')':
printf("%c\n",a[i]);
if(op_top!=-1){
while(optr[op_top]!='('){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
}
op_top--;
flag=0;
break;
case '+':
case '-':
printf("%c\n",a[i]);
if(flag==1){
if(a[i]=='-'){
op_top++;
optr[op_top]='@';
}
break;
}
while(op_top!=-1&&optr[op_top]!='('){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
op_top++;
optr[op_top]=a[i];
flag=0;
break;
case '*':
case '/':
printf("%c\n",a[i]);
if(op_top!=-1){
while(optr[op_top]=='*'||optr[op_top]=='/'){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
}
op_top++;
optr[op_top]=a[i];
flag=0;
break;
default:
printf("%c\n",a[i]);
if(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
while(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
}
if(a[i]=='.'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
while(a[i]>='0'&&a[i]<='9'){
NL++;
nibolan[NL]=a[i];
if(i<sizeof(a)-1){
i++;
}
}
}
}
i--;
NL++;
nibolan[NL]='#';
flag=0;
break;
}
}
while(op_top!=-1){
NL++;
nibolan[NL]=optr[op_top];
op_top--;
}
for(i=0;i<=NL;i++){
printf("%c",nibolan[i]);
}
printf("\n");
printf("%d\n",NL);
double d=0;
double x=0.1;
for(i=0;i<=NL;i++){
switch(nibolan[i]){
case '+':
data[data_top-1]=data[data_top-1]+data[data_top];
data_top--;
break;
case '-':
data[data_top-1]=data[data_top-1]-data[data_top];
data_top--;
break;
case '*':
data[data_top-1]=data[data_top-1]*data[data_top];
data_top--;
break;
case '/':
if(data[data_top]==0){
printf("表达式有错误,除数不能为零\n");
}else{
data[data_top-1]=data[data_top-1]/data[data_top];
data_top--;
}
break;
case '@':
data[data_top]=-(data[data_top]);
break;
default:
d=0;
while(nibolan[i]>='0'&&nibolan[i]<='9'){
d=d*10+(nibolan[i]-'0');
i++;
}
x=0.1;
if(nibolan[i]=='.'){
i++;
while(nibolan[i]>='0'&&nibolan[i]<='9'){
d=d+x*(nibolan[i]-'0');
x=x*x;
i++;//这时候是‘#’,跳过
}
}
data_top++;
data[data_top]=d;
break;
}
}
double result=data[data_top];
printf("表达式的结果是:%lf\n",result);
return 0;
}
0 0
- 中缀表达式转后缀表达式(逆波兰表达式)
- 中缀表达式转后缀表达式(逆波兰表达式)
- 逆波兰表达式 中缀表达式 后缀表达式
- 中缀表达式转后缀表达式(逆波兰式)
- 中缀表达式转后缀表达式(又称逆波兰式)
- 中缀表达式转后缀表达式(逆波兰)
- 数据结构--中缀表达式转为后缀表达式(逆波兰表达式)
- 前缀、中缀、后缀表达式(逆波兰表达式)
- 【基础知识】【中缀转逆波兰(后缀)表达式】
- 逆波兰式(中缀表达式转成后缀表达式)
- 【数据结构】中缀表达式转换后缀表达式(逆波兰式)
- 中缀表达式转化为后缀表达式,计算中缀表达式,计算后缀表达式(有注释)(逆波兰表达式)
- 中缀表达式转逆波兰
- 中缀表达式转后缀表达式(逆波兰式)的C++代码
- 【数据结构】逆波兰表示法(RPN):中缀表达式转后缀表达式
- NYOJ-35-表达式求值(中缀式转后缀式 逆波兰表达式)
- 数据结构-----栈(逆波兰表达式)----中缀转后缀
- 逆波兰:将中缀表达式转为后缀表达式
- 二叉树的最大节点
- 电路中电容、电感的主要作用
- 手机问题点整理和总结
- 单例模式之使用enum枚举数据类型实现
- HDU 5269 ZYB loves Xor I(位运算)
- 中缀表达式转后缀表达式(逆波兰表达式)
- jquery筛选过滤函数
- 在java使用xssProject
- 剑指offer--变态跳台阶
- 信号------信号的基本概念
- 提取不同颜色细胞
- netty中拆包粘包问题
- 百度地图多个InfoWindow同时展示
- 欢迎使用CSDN-markdown编辑器