问题描述:设计一个程序,演示用算符优先法对算术表达式求值的过程。利用算符优先关系,实现对算术四则混合运算表达式的求值。
(1)输入的形式:表达式,例如2*(3+4)#
包含的运算符只能有’+’ 、’-’ 、’’ 、’/’ 、’(’、 ‘)’,“#”代表输入结束符;
(2)输出的形式:运算结果,例如2(3+4)=14;
(3)程序所能达到的功能:对表达式求值并输出。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define stack_init_size 100
#define stackincrement 10
struct stack
{
int *base;
int *top;
char data;
int stacksize;
};
void initstack(struct stack &s)
{
char e;
s.base = (int*)malloc(stack_init_size * sizeof(int));
if(!s.base)
exit(0);
s.top = s.base;
s.stacksize = stack_init_size;
}
char stack_top(struct stack s)
{
char e;
if(s.top==s.base)
return -1;
e = *(s.top-1);
return e;
}
void push(struct stack &s,int e)
{
if(s.top-s.base >= s.stacksize)
{
s.base = (int*)realloc(s.base,(s.stacksize + stackincrement) * sizeof(int));
if(!s.base)
exit(0);
s.top = s.base + s.stacksize;
s.stacksize += stackincrement;
}
*s.top++ = e;
}
char pop(struct stack &s)
{
char e;
if(s.top==s.base)
return -1;
e = *--s.top;
return e;
}
int getIndex(char theta) //获取theta所对应的索引
{
int index = 0;
switch (theta)
{
case '+':
index = 0;
break;
case '-':
index = 1;
break;
case '*':
index = 2;
break;
case '/':
index = 3;
break;
case '(':
index = 4;
break;
case ')':
index = 5;
break;
case '#':
index = 6;
default:break;
}
return index;
}
char getPriority(char theta1, char theta2) //获取theta1与theta2之间的优先级
{
const char priority[][7] = //算符间的优先级关系
{
{ '>','>','<','<','<','>','>' },
{ '>','>','<','<','<','>','>' },
{ '>','>','>','>','<','>','>' },
{ '>','>','>','>','<','>','>' },
{ '<','<','<','<','<','=','0' },
{ '>','>','>','>','0','>','>' },
{ '<','<','<','<','<','0','=' },
};
int index1 = getIndex(theta1);
int index2 = getIndex(theta2);
return priority[index1][index2];
}
int main(void)
{
struct stack s1;
struct stack s2;
initstack(s1);
initstack(s2);
char order[10];
int i;
char temp;
char temp1;
char temp2;
printf("input the order,beginning with # and ending with #\n");
scanf("%s",order);
for(i=0;i<strlen(order);i++)
{
if(order[i]<=57&&order[i]>=48)
push(s1,order[i]);
else
{
temp = getPriority(order[i],stack_top(s2));
if(temp=='>')
push(s2,order[i]);
else if(temp=='=')
pop(s2);
else
{
temp1 = (int)stack_top(s1);
pop(s1);
temp2 = (int)stack_top(s1);
pop(s1);
if(stack_top(s2)=='+')
push(s1,temp2 + temp1-48-48);
else if(stack_top(s2)=='-')
push(s1,temp2-temp1);
else if(stack_top(s2)=='*')
push(s1,(temp2-48)*(temp1-48));
else
push(s1,(temp2-48)*1.0/(temp1-48));
}
}
}
printf("%d\n",stack_top(s1));
return 0;
}
但是混合运算会出错,大家帮我看看。