表达式求值问题++数据结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》
课程设计报告书课程题目:表达式求值问题
一.需求分析
(1)以字符序列的形式从终端输入语法正确的不含变量的整数表达式,将该中缀表达式转换为后缀表达式。
(2)实现对后缀表达式的求值。
(3)演示在求值过程中运算符栈,操作数栈,输入字符和主要操作的变化过程。
二.概要设计
表达式求值的算法分为两步进行:首先将中缀表达式转换为后
缀表达式,再求后缀表达式的值。
(1)将中缀表达式转换为后缀表达式,对于字符串形式的合法的中缀表达式,“(”的运算优先级最高,“*”次
之,“+”,“—”最低,同级运算符从左到右按顺序运
算。转化过程算法描述如下:从左到右对中缀表达式
进行扫描,每次处理一个字符。若遇到左括号入栈。
如遇到数字,原样输出。若遇到运算符,如果它的优
先级比栈顶元素优先级高,则直接入栈,否则栈顶元
素出栈,直到新栈顶数据元素的优先级比它低,然后
将它直接入栈。重复以上步骤,直到表达式结束。若
表达式已全部结束,将栈顶元素全部出栈。
(2)后缀表达式求值算法描述如下:从左到右对后缀表达式进行扫描,每次处理一个字符。若遇到数字,转化
为整数,入栈。若遇到运算符,出栈两个值进行运算,
运算结果再入栈。重复以上步骤,直到表达式结束,
栈中最后一个数据元素就是所求表达式的结果。三.详细设计
#include
#include
#define TRUE 1
#define FALSE 0
#define MAXNUM 100
typedef int DataType;
struct SeqStack
{ DataType s[MAXNUM];
int t;
};
typedef struct SeqStack *PSeqStack;
PSeqStack createEmptyStack_seq()
{
PSeqStack pastack;
pastack = (PSeqStack)malloc(sizeof(struct SeqStack));
if (pastack == NULL)
printf("Out of space!!\n");
else
pastack->t = -1;
return pastack;
} int isEmptyStack_seq(PSeqStack pastack)
{
return pastack->t == -1;
} void push_seq(PSeqStack pastack, DataType x)
{
if (pastack->t >= MAXNUM - 1)
printf("Overflow!\n");
else
{
pastack->t = pastack->t + 1;
pastack->s[pastack->t] = x;
}
} void pop_seq(PSeqStack pastack)
{
if (pastack->t == -1)
printf("Underflow!\n");
else
pastack->t = pastack->t - 1;
} DataType top_seq(PSeqStack pastack)
{
return pastack->s[pastack->t];
} int infixtoSuffix(const char * infix, char * suffix)
{ /*将中缀表达式转换为后缀表达式,顺利转换返回true,若转换过程中发现中缀表达式非法则返回false*/
int state_int = FALSE;
/*state_int记录状态,等于true表示刚读入的是数字字符,等于false表示刚读入的不是数字字符,
设置这个变量是为了在每输出一个整数后输出一个空格,以免连续输出的两个整数混在一起。*/
char c, c2;
PSeqStack ps = createEmptyStack_seq(); /*运算符栈*/
int i, j = 0;
if (infix[0] == '\0')
return FALSE; /*不允许出现空表达式*/
for (i = 0; infix[i] != '\0'; i++)
{
c = infix[i];
switch (c)
{
case ' ':
case '\t':
case '\n':
if (state_int == TRUE)
suffix[j++] = ' ';/*状态从true转换为false时输出一个空格*/
state_int = FALSE;
break; /*遇到空格或制表符忽略*/
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
state_int = TRUE;
suffix[j++] = c; /*遇到数字输出*/
break;
case '(':
if (state_int == TRUE)
suffix[j++] = ' ';/*状态从true转换为false时输出一个空格*/