-
main.c
#include<stdio.h>
#include<stdlib.h>
#include"Expression_evaluation.h"
int main(void)
{
char InfixStr[MAXSIZE] = { 0 }, SuffixStr[MAXSIZE] = { 0 };
Read_Expression(InfixStr,MAXSIZE);
InfixToSuffix(InfixStr, SuffixStr,MAXSIZE);
printf("\n结果是:%f\n", Calculate(SuffixStr, MAXSIZE));
system("pause");
return 0;
}
-
Expression_evaluation.h
#define MAXSIZE 100
struct SNode {
char Data[MAXSIZE];
int Top;
};
typedef struct SNode* Stack;
struct SNodeOfInt {
float Data[MAXSIZE];
int Top;
};
typedef struct SNodeOfInt* StackOfFloat;
int Compare(char, Stack);
void Read_Expression(char[], int);
void InfixToSuffix(char[], char[], int);
float Calculate(char[], int);
void Push(Stack, char);
void PushFloat(StackOfFloat, float);
char Pop(Stack);
float PopFloat(StackOfFloat);
-
Read_Expression.c
#include<stdio.h>
#include<stdlib.h>
#include"Expression_evaluation.h"
void Read_Expression(char str[], int length)
{
printf("请输入所需求值的中缀表达式(英文输入法):\n");
gets(str);
return str;
}
-
InfixToSuffix.c
#include<stdio.h>
#include<stdlib.h>
#include"Expression_evaluation.h"
void InfixToSuffix(char Infix[], char Suffix[], int length)
{
int i = 0,j=0,Tag=0;
struct SNode S_1 = { {'\0'},-1 };
Stack SPtr = &S_1;
while (Infix[i] != '\0')
{
if (Infix[i] <= '9'&&Infix[i] >= '0')
{
Suffix[j] = Infix[i];
j++;
}
else if (Infix[i] == ' ')
{
Suffix[j] = Infix[i];
j++;
}
else if (Infix[i] == '+' || Infix[i] == '-' || Infix[i] == '*' || Infix[i] == '/')
{
Suffix[j] =' ';
j++;
Tag = 0;
while (Tag == 0)
{
Tag = Compare(Infix[i], SPtr);
if (Tag == 0)
{
Suffix[j] = Pop(SPtr);
j++;
}
else
{
Push(SPtr, Infix[i]);
}
}
}
else if(Infix[i]=='(')
{
Push(SPtr, Infix[i]);
}
else if (Infix[i] == ')')
{
Suffix[j] = ' ';
j++;
while (SPtr->Data[SPtr->Top] != '(')
{
Suffix[j] = Pop(SPtr);
j++;
}
Pop(SPtr);
}
i++;
}
while (SPtr->Top != -1)
{
Suffix[j] = Pop(SPtr);
j++;
}
}
-
Compare.c
#include<stdio.h>
#include<stdlib.h>
#include"Expression_evaluation.h"
int Compare(char ch_1, Stack SPtr)
{
if (SPtr->Top == -1)
{
return 1;
}
if (SPtr->Data[SPtr->Top] == '(')
{
return 1;
}
else if (SPtr->Data[SPtr->Top] == '/' || SPtr->Data[SPtr->Top] == '*')
{
if (ch_1 == '*' || ch_1 == '/')
{
return 0;
}
else
{
return 0;
}
}
else
{
if (ch_1 == '*' || ch_1 == '/')
{
return 1;
}
else
{
return 0;
}
}
}
-
Calculate.c
#include<stdio.h>
#include<stdlib.h>
#include"Expression_evaluation.h"
float Calculate(char Suffix[], int length)
{
float sum = 0, temp = 0, first = 0, last = 0;
int i = 0;
struct SNodeOfInt S = { {0},-1 };
StackOfFloat SPtr = &S;
while (Suffix[i] != '\0')
{
while (Suffix[i] != '\0')
{
if (Suffix[i] <= '9'&&Suffix[i] >= '0')
{
sum = 0;
while (Suffix[i] <= '9'&&Suffix[i] >= '0')
{
temp = (float)(Suffix[i] - '0');
sum = sum * 10 + temp;
i++;
}
PushFloat(SPtr, sum);
}
if (Suffix[i] == ' ')
{
i++;
}
if (Suffix[i] == '+' || Suffix[i] == '-' || Suffix[i] == '*' || Suffix[i] == '/')
{
last = PopFloat(SPtr);
first = PopFloat(SPtr);
if (Suffix[i] == '+')
{
PushFloat(SPtr, first + last);
i++;
}
else if (Suffix[i] == '-')
{
PushFloat(SPtr, first - last);
i++;
}
else if (Suffix[i] == '*')
{
PushFloat(SPtr, first*last);
i++;
}
else
{
PushFloat(SPtr, first / last);
i++;
}
}
}
return PopFloat(SPtr);
}
}
-
Pop.c
#include<stdio.h>
#include<stdlib.h>
#include"Expression_evaluation.h"
char Pop(Stack SPtr)
{
if (SPtr->Top == -1)
{
printf("堆栈空");
return '\n';
}
else
{
return (SPtr->Data[(SPtr->Top)--]);
}
}
float PopFloat(StackOfFloat SPtr)
{
if (SPtr->Top == -1)
{
printf("堆栈空");
return '\n';
}
else
{
return (SPtr->Data[(SPtr->Top)--]);
}
}
-
Push.c
#include<stdio.h>
#include<stdlib.h>
#include"Expression_evaluation.h"
void Push(Stack SPtr, char itme)
{
if (SPtr->Top == MAXSIZE - 1)
{
printf("堆栈满");
return;
}
else
{
SPtr->Data[++(SPtr->Top)] = itme;
return;
}
}
void PushFloat(StackOfFloat SPtr, float itme)
{
if (SPtr->Top == MAXSIZE - 1)
{
printf("堆栈满");
return;
}
else
{
SPtr->Data[++(SPtr->Top)] = itme;
return;
}
}