中缀表达式转后缀表达式(逆波兰表达式)
2017-04-16 13:57
239 查看
#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[o
4000
p_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[o
4000
p_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;
}
相关文章推荐
- 【数据结构】逆波兰表示法(RPN):中缀表达式转后缀表达式
- 中缀表达式转换成后缀表达式以及逆波兰表示法求值
- 中缀表达式转换为后缀表达式及逆波兰式计算
- 中缀表达式转后缀表达式(逆波兰表达式)
- 整理一下中缀表达式转后缀表达式(逆波兰表达式)的算法-调度场算法(shunting yard algorithm)
- 将中缀表达式转化成后缀表达式(逆波兰式)
- 逆波兰中 中缀表达式转后缀表达式的方法
- 逆波兰:将中缀表达式转为后缀表达式
- 逆波兰计算器--中缀表达式转后缀表达式
- 逆波兰式(中缀表达式转成后缀表达式)
- 中缀表达式转化为后缀表达式,计算中缀表达式,计算后缀表达式(有注释)(逆波兰表达式)
- 中缀表达式转后缀(逆波兰)表达式
- 逆波兰计算器与中缀表达式向后缀表达式的转化实例
- C语言利用栈实现将中缀表达式转换为后缀表达式(即逆波兰式)
- 栈应用:中缀表达式转后缀表达式并以二叉树储存
- 利用栈将中缀表达式转换成后缀表达式
- 中缀表达式转换为后缀表达式
- 中缀表达式转换为后缀表达式
- 中缀表达式转后缀表达式
- C++栈的应用——后缀表达式求值、中缀表达式到后缀表达式的转换