您的位置:首页 > 编程语言

前缀表达式转后缀表达式及求值经典代码

2018-03-13 19:38 579 查看
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

typedef struct stack
{
int top;
char s[100];
}Stack;

typedef struct OPstack
{
int top;
float s[100];
}OPStack;

void InitStack(Stack *stack)
{
stack->top = 0;
}

void pushStack(Stack *stack,char ch)
{
stack->s[stack->top++] = ch;
}
_Bool isEmpty( Stack *stack)
{
if (stack->top == 0)
{
return 1;
}

return 0;
}

_Bool getTop( Stack *stack, char *ch)
{
*ch = (stack->s)[stack->top - 1];
return 1;
}
char Popstack(Stack *stack)
{
stack->top = stack->top-1;
return stack->s[stack->top];
}
void ZhongToHou(char * source, char *exp)
{
Stack stack;
InitStack(&stack);
int i = 0;
int j = 0;
char ch = source[i++];
char e = 0;
while (ch != '\0')
{
switch (ch)
{
case '(':
pushStack(&stack,ch);
break;
case ')':
while (!isEmpty(&stack) && getTop(&stack,&e) && e !='(')

//ch=Popstack(&stack);
//printf("你好=%c\n", ch);
exp[j++] = Popstack(&stack);
}
Popstack(&stack);//弹出'('
break;
case '+':
case '-':
while (!isEmpty(&stack) && getTop(&stack, &e) && e != '(')
{
exp[j++] = Popstack(&stack);
}
pushStack(&stack, ch);
break;
case '*':
case '/':
while (!isEmpty(&stack) && getTop(&stack, &e) && e == '*'||e=='/')
{
exp[j++] = Popstack(&stack);
}
pushStack(&stack, ch);
break;
default:
while(ch >= '0' && ch <= '9')
{
exp[j++] = ch;
ch = source[i++];
}
i--;
exp[j++] = ' ';
break;
}
ch = source[i++];
}

while (!isEmpty(&stack))
{
exp[j++] = Popstack(&stack);
}
exp[j] = '\0';
}
float ComputeExpress(char a[])     //计算后缀表达式的值
{
OPStack s;
s.top = -1;
int i = 0,result;
int j = 0;
float x1, x2;
char ch = a[i];

while (ch!='\0')
{
if (ch >= '0' && ch <= '9')
{
int v = 0;
while (ch>='0' && ch <='9')
{
v = v*10 + (ch - '0');
i++;
ch = a[i];
}
i--;
s.top++;
s.s[s.top] = v;
//printf("\nnum=%d\n", v);
}
else
{
switch (ch)
{
case '+':
x1 = s.s[s.top];
s.top--;
x2 = s.s[s.top];
s.top--;
result = x1 + x2;
s.top++;

s.s[s.top] = result;
printf("result===%d,top=====%d", result, s.top);
break;
case '-':
x1 = s.s[s.top];
s.top--;
x2 = s.s[s.top];
s.top--;
result = x2-x1;
s.top++;

s.s[s.top] = result;
break;
case '*':
x1 = s.s[s.top];
s.top--;
x2 = s.s[s.top];
s.top--;
result = x2 * x1;
s.top++;
s.s[s.top] = result;
break;
case '/':
x1 = s.s[s.top];
s.top--;
x2 = s.s[s.top];
s.top--;
result = x2 / x1;
s.top++;
s.s[s.top] = result;
break;
default:
break;
}
}
i++;
ch = a[i];
}
if (s.top != -1)       //如果栈不为空,将结果出栈并返回
{
result = s.s[s.top];
s.top--;
if (s.top == -1) {
printf("result===%d", result);
return result;
}
else
{
printf("表达式错误!\n");
exit(-1);
}
}
}
void main()
{
printf("请输入表达式:");
char a[100] = { 0 }; char  b[100] = { 0 };
scanf("%s", a);

printf("中缀表达式:");
printf("%s", a);

ZhongToHou(a,b);
printf("后缀表达式:");
printf("%s",b);
printf("结果为:");
printf("结果= %lf", ComputeExpress(b));

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息