#include<iostream>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#define max 100
using namespace std;
long double str2num(const char *s)
{
long double num;
sscanf(s, "%lf", &num);
return num;
}
char ex[max]; /*存储后缀表达式*/
void trans() /*将算术表达式转化为后缀表达式*/
{
char str[max]; /*存储原算术表达式*/
char stack[max]; /*作为栈使用*/
char ch;
int sum,i,j,t,top=0;
i=0; /*获取用户输入的表达式*/
do
{
i++;
cin>>str[i];/*此步我用的是C++ C语言的话在后面 之所以用这个有一点区别 都*/
//scanf("%c",&str[i]);
} while(str[i]!='#' && i!=max);
sum=i;
t=1;i=1;
ch=str[i];i++;
while(ch!='#'){
switch(ch){
case '(': /*判定为左括号*/
stack[++top]=ch;
break;
case ')': /*判定为右括号*/
while(stack[top]!='(')
ex[t++]=stack[top--];
top--;
break;
case '+': /*判定为加减号*/
case '-':
while(top!=0&&stack[top]!='(')
ex[t++]=stack[top--];
stack[++top]=ch;
break;
case '*': /*判定为乘除号*/
case '/':
while(stack[top]=='*'||stack[top]=='/')
ex[t++]=stack[top--];
stack[++top]=ch;
break;
case '#':
break;
default:
while(ch>='0'&&ch<='9'||ch=='.') /*判定为数字*/
{
ex[t++]=ch;
ch=str[i++];
}
i--;
ex[t++]=' ';
}
ch=str[i];i++;
}
while(top!=0)
ex[t++]=stack[top--];
ex[t]=' ';
for(j=1;j<t;j++)
printf("%c",ex[j]);
printf("\n");
}
void compvalue(){ /*计算后缀表达式的值*/
float stack[max],d; /*作为栈使用*/
char ch;
int t=1,top=0; /*t为ex下标,top为stack下标*/
ch=ex[t++];
string digit;
while(ch!=' '){
switch(ch){
case '+':
stack[top-1]=stack[top-1]+stack[top];
top--;
break;
case '-':
stack[top-1]=stack[top-1]-stack[top];
top--;
break;
case '*':
stack[top-1]=stack[top-1]*stack[top];
top--;
break;
case '/':
if(stack[top]!=0) stack[top-1]=stack[top-1]/stack[top];
else{
printf("除零错误!\n");
exit(0); /*异常退出*/
}
top--;
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
digit = "";
while(ch>='0'&&ch<='9'||ch=='.'){ /*将数字字符转化为对应的数值*/
digit += ch;
ch=ex[t];t++;
}
d=str2num(digit.c_str());
top++;
stack[top]=d;
break;
default:
top++;
break;
}
ch=ex[t];t++;
}
printf("%f",stack[top]);
}
int main(){
trans();
compvalue();
system("pause");
return 0;
}
逆波兰式算法(加减乘除,小数)
最新推荐文章于 2022-08-27 12:06:25 发布