您的位置:首页 > 其它

后缀表达式求值

2013-02-27 19:21 281 查看
一、问题描述

将用户输入的前缀表达式转化为后缀表达式后,就可以计算表达式的值。本文给出后缀表达式求值的具体实现。

例:有前缀表达式:8-(3+2*6)/5+4;转化为后缀表达式后为:8 3 2 6 * + 5 / - 4 +

 

二、算法实现

1.后缀表达式存储在一维数组中,遍历数组;

2.遍历过程中,当遇到的是数字时,则直接将其push到栈中;

3.当遇到的是标点符号时,则依次从栈中弹出两个数字,计算组成的表达式的值,并将结果入栈;

4.遍历结束后,栈中会有一个值,就是最终结果,将其弹出即可。

三、代码

#include <stdio.h>
#include <stdlib.h>
#include "stack_yutao.h"

void display_array(int array[]);
int postfix_caculation(int postfix_array[]);
elemtype caculate_value(elemtype a, elemtype array_i,elemtype b);
void convert_to_int(char postfix_array[], int postfix_int[]);

int main()
{
int ans = 0;
char postfix_array[] = "8326*+5/-4+";
int postfix_int[15];//how to define the size ???
convert_to_int(postfix_array,postfix_int);
//	display_array(postfix_int);
ans = postfix_caculation(postfix_int);
printf("This postfix array's value is %d !\n",ans);

system("pause");
return 0;
}

//计算后缀表达式的值
int postfix_caculation(int postfix_int[])
{
elemtype result = 0;
int i = 0;
elemtype num1, num2, temp;
int stack_size = 10; //定义栈的大小为10
stack char_stack;         //声明栈
stack *s = &char_stack;

initStack(s,stack_size); //初始化栈

while(postfix_int[i] != '\0') //遍历后缀表达式
{
if(0 <= postfix_int[i] && postfix_int[i] <= 9)
{
push(s,postfix_int[i]);
}else
{
get_top(s,&num1);
pop(s);
get_top(s,&num2);
pop(s);
temp = caculate_value(num2,postfix_int[i],num1);
push(s,temp);
}
i ++;
}
get_top(s,&result);
return result;
}

elemtype caculate_value(elemtype a, char array_i,elemtype b)
{
elemtype result;
switch(array_i)
{
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
default:
printf("wrong postfix_array !\n");
break;
}
return result;
}
void convert_to_int(char postfix_array[], int postfix_int[])
{
int i = 0;
while(postfix_array[i] != '\0')
{
if('0' <= postfix_array[i] && postfix_array[i] <= '9')
{
postfix_int[i] = postfix_array[i] - '0';
}else
{
postfix_int[i] = postfix_array[i];
}
i ++;
}
postfix_int[i] = '\0';
}

//输出数组中的内容
void display_array(int array[])
{
int i = 0;
while(array[i] != '\0')
{
printf("%d ",array[i++]);
}
printf("\n");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: