栈的应用——四则表达式中缀转后缀
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElemType;
typedef struct StackNode
{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStackNode;
typedef struct LinkStack
{
LinkStackNode top;
int Count;
}LinkStack;
typedef struct StackNodeF
{
float data;
struct StackNodeF *next;
}StackNodeF, *LinkStackNodeF;
typedef struct LinkStackF
{
LinkStackNodeF top;
int Count;
}LinkStackF;
void push_StackChar(LinkStack *S, ElemType e)
{
LinkStackNode sNew = (LinkStackNode)malloc(sizeof(StackNode));
sNew->data = e;
sNew->next = S->top;
S->top = sNew;
S->Count++;
}
void pop_StackChar(LinkStack *S, ElemType *e)
{
LinkStackNode p = NULL;
p = S->top;
*e = S->top->data;
S->top = S->top->next;
free(p);
p = NULL;
S->Count--;
}
void Change(char zhonzhui[], char houzhui[])
{
LinkStack S;
S.top = NULL;
S.Count = 0;
int i = 0;
int j = 0;
char temp;
while(zhonzhui[i] != '\0')
{
if (zhonzhui[i] >= '0' && zhonzhui[i] <= '9')
{
while((zhonzhui[i] >= '0' && zhonzhui[i] <= '9') || (zhonzhui[i] == '.'))
{
houzhui[j] = zhonzhui[i];
++i;
++j;
}
houzhui[j] = ' ';
++j;
}
if ((zhonzhui[i] == '*') || (zhonzhui[i] == '/') || (zhonzhui[i] == '('))
{
push_StackChar(&S, zhonzhui[i]);
}
if (zhonzhui[i] == ')')
{
while(S.top->data != '(')
{
pop_StackChar(&S, &houzhui[j]);
++j;
houzhui[j] = ' ';
++j;
}
pop_StackChar(&S, &temp);
}
if ((zhonzhui[i] == '+') || (zhonzhui[i] == '-'))
{
if (S.top != NULL)
{
if ((S.top->data == '*') || (S.top->data == '/'))
{
while(S.top != NULL)
{
pop_StackChar(&S, &houzhui[j]);
++j;
houzhui[j] = ' ';
++j;
}
push_StackChar(&S, zhonzhui[i]);
}
else
{
push_StackChar(&S, zhonzhui[i]);
}
}
else
{
push_StackChar(&S, zhonzhui[i]);
}
}
++i;
}
while(S.top != NULL)
{
pop_StackChar(&S, &houzhui[j]);
++j;
houzhui[j] = ' ';
++j;
}
houzhui[j] = '\0';
}
void push_StackF(LinkStackF *S, float e)
{
LinkStackNodeF sNew = (LinkStackNodeF)malloc(sizeof(StackNodeF));
sNew->data = e;
sNew->next = S->top;
S->top = sNew;
S->Count++;
}
void pop_StackF(LinkStackF *S, float *e)
{
LinkStackNodeF p = NULL;
p = S->top;
*e = S->top->data;
S->top = S->top->next;
free(p);
p = NULL;
S->Count--;
}
void Sum(char houzui[], float *result)
{
LinkStackF sNum;
sNum.top = NULL;
sNum.Count = 0;
int i = 0;
float e = 0;
while(houzui[i] != '\0')
{
if (houzui[i] == ' ')
{
++i;
}
if ((houzui[i] >= '0') && (houzui[i] <= '9'))
{
e = atof((houzui + i));
push_StackF(&sNum, e);
while(houzui[i] != ' ')
{
++i;
}
}
if ((houzui[i] == '*') || (houzui[i] == '/') || (houzui[i] == '+') || (houzui[i] == '-') )
{
float l, r, sum;
pop_StackF(&sNum, &r);
pop_StackF(&sNum, &l);
if (houzui[i] == '*')
{
sum = l * r;
}
else if (houzui[i] == '/')
{
sum = l / r;
}
else if (houzui[i] == '-')
{
sum = l - r;
}
else
{
sum = l + r;
}
push_StackF(&sNum, sum);
}
++i;
}
pop_StackF(&sNum, result);
}
int main()
{
char zhonzhui[45] = { };
char houzhui[45] = { };
float result = 0;
printf("Please enter the expression to be calculated: ");
fgets(zhonzhui, 40, stdin);
zhonzhui[strlen(zhonzhui) - 1] = '\0';
Change(zhonzhui, houzhui);
Sum(houzhui, &result);
printf(" %s \n", houzhui);
printf(" The result is %.2f\n",result);
return 0;
}