1. 完整代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#define MaxSize 20
typedef struct{
double data[MaxSize];
int top;
}SqStack_N;
void InitStack_N(SqStack_N &S){
S.top = -1;
}
bool Empty_N(SqStack_N S){
if(S.top == -1){
return true;
}
return false;
}
bool Push_N(SqStack_N &S, double e){
if(S.top + 1 == MaxSize){
return false;
}
S.data[++S.top] = e;
return true;
}
bool Pop_N(SqStack_N &S, double &e){
if(Empty_N(S)){
return false;
}
e = S.data[S.top--];
return true;
}
typedef struct{
char data[MaxSize];
int top;
}SqStack_S;
void InitStack_S(SqStack_S &S){
S.top = -1;
}
bool Empty_S(SqStack_S S){
if(S.top == -1){
return true;
}
return false;
}
bool Push_S(SqStack_S &S, char e){
if(S.top + 1 == MaxSize){
return false;
}
S.data[++S.top] = e;
return true;
}
bool Pop_S(SqStack_S &S, char &e){
if(Empty_S(S)){
return false;
}
e = S.data[S.top--];
return true;
}
double ars(double a, double b, char c){
if(c == '+'){
return a+b;
}
if(c == '-'){
return a-b;
}
if(c == '*'){
return a*b;
}
if(c == '/'){
return a/b;
}
return 0;
}
int ispriority(char ch){
switch (ch){
case '#':
return 0;
break;
case '(':
return 1;
break;
case '*':
case '/':
return 5;
break;
case '+':
case '-':
return 3;
break;
case ')':
return 6;
break;
default:
break;
}
return -1;
}
int icpriority(char ch){
switch (ch){
case '#':
return 0;
break;
case '(':
return 6;
break;
case '*':
case '/':
return 4;
break;
case '+':
case '-':
return 2;
break;
case ')':
return 1;
break;
default:
break;
}
return -1;
}
void ExpreesionEvaluation(double &ans){
SqStack_N S_Num;
SqStack_S S_Symbol;
InitStack_N(S_Num);
InitStack_S(S_Symbol);
char str[MaxSize];
printf("字符串中间不要加空格,并且以 # 结尾\n");
scanf("%s",str);
double Num[MaxSize];
char Symbol[MaxSize];
int a[10],k = 0, p = 0;
for(int i = 0; i < strlen(str); i++){
if(str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/' && str[i] !='(' && str[i] != ')' && str[i] != '#'){
a[++k] = str[i];
}else{
if(k != 0){
int num = 0,temp = k;
while(k != 0){
num += (a[k] - 48)*(pow(10,(temp - k)));
k--;
}
Num[p++] = num;
}
Symbol[p++] = str[i];
}
}
Push_S(S_Symbol,'#');
for(int i= 0; i < p; i++){
if(Symbol[i] != '+' && Symbol[i] != '-' && Symbol[i] != '*' && Symbol[i] != '/' && Symbol[i] !='(' && Symbol[i] != ')' && Symbol[i] != '#'){
Push_N(S_Num,Num[i]);
}else{
if(icpriority(Symbol[i]) == '#'){
break;
}
if(icpriority(Symbol[i]) > ispriority(S_Symbol.data[S_Symbol.top])){
Push_S(S_Symbol,Symbol[i]);
}else{
while(icpriority(Symbol[i]) < ispriority(S_Symbol.data[S_Symbol.top])){
char q;
double e1, e2;
Pop_S(S_Symbol,q);
Pop_N(S_Num,e1);
Pop_N(S_Num,e2);
double ans = ars(e2,e1,q);
Push_N(S_Num,ans);
}
if(icpriority(Symbol[i]) == ispriority(S_Symbol.data[S_Symbol.top])){
char q;
Pop_S(S_Symbol,q);
}else{
Push_S(S_Symbol,Symbol[i]);
}
}
}
}
Pop_N(S_Num,ans);
}
int main(){
double ans;
char str[10];
ExpreesionEvaluation(ans);
printf("%.2f\n",ans);
return 0;
}
2、运行截图