表达式求值问题++数据结构

  • 格式:doc
  • 大小:110.50 KB
  • 文档页数:14

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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时输出一个空格*/