实验题目:算术表达式求值(算术计算器)
实验内容:
表达式求值是实现程序设计语言的基本问题之一,也是栈的应用的一个典型例子。一个算术表达式是由操作数(operand)、运算符(operator)和界限符 (delimiter)组成的。假设操作数是正整数,运算符只含加减乘除等四种二元运算符,界限符有左右括号和表达式起始、结束符“#”,如:#(7+15)*(23-28/4)#。引入表达式起始、结束符是为了方便。设计一个程序,演示算术表达式求值的过程。
实验要求:
1. 从文本文件输入任意一个语法正确的(中缀)表达式。
2. 利用栈结构,把(中缀)表达式转换成后缀表达式,并以适当的方式展示栈的状态变化过程和所得到的后缀表达式。
3. 利用栈结构,对后缀表达式进行求值,并以适当的方式展示栈的状态变化过程和最终结果。
目录
存储结构
typedef struct stack
{
int top;
ElemType elements[maxlength];
}STACK;
typedef struct stack_int
{
int top;
Elem elements[maxlength];
}STACK_Int;
/*将栈置为空*/
void MakeNull(STACK *s)
{
s->top=maxlength;
}
void MakeNull_Int(STACK_Int *s)
{
s->top=maxlength;
}
/*判断是否为空,为空返回1,否则返回0*/
int Empty(STACK s)
{
if(s.top<maxlength)
return 0;
else
return 1;
}
int Empty_Int(STACK_Int s)
{
if(s.top<maxlength)
return 0;
else
return 1;
}
/*返回栈顶元素,若stack为空则返回0*/
ElemType Top(STACK s)
{
if(Empty(s)==1)
{
return 0;
}
else
{
return s.elements[s.top];
}
}
Elem Top_Int(STACK_Int s)
{
if(Empty_Int(s)==1)
{
return 0;
}
else
{
return s.elements[s.top];
}
}
void Display(STACK s)
{
while(s.top!=maxlength)
{
printf("%c ",s.elements[s.top]);
s.top++;
}
}
void Display_Int(STACK_Int s)
{
while(s.top!=maxlength)
{
printf("%d ",s.elements[s.top]);
s.top++;
}
}
/*删除栈顶元素*/
void Pop(STACK *s)
{
if(Empty(*s) == 1)
{
printf("Stack is empty!");
}
else
{
s->top=s->top+1;
}
}
void Pop_Int(STACK_Int *s)
{
if(Empty_Int(*s) == 1)
{
printf("Stack is empty!");
}
else
{
s->top=s->top+1;
}
}
/*将元素x压入栈顶*/
void Push(STACK *s,ElemType x)
{
if(s->top==0)
{
printf("Stack is full!");
}
else
{
s->top=s->top-1;
s->elements[s->top]=x;
}
}
void Push_Int(STACK_Int *s,Elem x)
{
if(s->top==0)
{
printf("Stack is full!");
}
else
{
s->top=s->top-1;
s->elements[s->top]=x;
}
}