基于栈结构的中缀表达式求值

  • 格式:doc
  • 大小:32.50 KB
  • 文档页数:12

实验三 基于栈结构的中缀表达式求值

班级:计科13

1、问题描述

从键盘输入一中缀表达式字符串,读字符串,利用栈结构实现表达式求值。

2、输入与输出

输入:从键盘中缀表达式如: 32+5×(6-4)

输出:计算结果42

3、需求分析

1.定义两个栈结构,数栈用于存放表达式中的数,符号栈用于存放表达式中的符号,实现栈的运算

2.在读数的时候考虑多位运算

3.实现表达式求值

4、开发工具与环境

硬件设备:微型计算机系统

软件环境:操作系统Windows,开发工具等等

5、概要设计

1.结构定义

typedef struct /* 运算符栈 */

{ char *base,*top;

int stacksize;

}SqStack;

typedef struct /* 运算数栈 */ { int *base,*top;

int stacksize;

}SqStack1;

int priority[7][7]={{'>', '>', '<', '<', '<', '>', '>'}, // +

{'>', '>', '<', '<', '<', '>', '>'}, // -

{'>', '>', '>', '>', '<', '>', '>'}, // *

{'>', '>', '>', '>', '<', '>', '>'}, // /

{'<', '<', '<', '<', '<', '=', }, // (

{'>', '>', '>', '>', ' ', '>', '>'}, // )

{'<', '<', '<', '<', '<', ' ', '='} // #

};

/*用于比较符号优先级的全局二维数组*/

2.各函数模块

void InitStack(SqStack *s);

操作结果:初始化运算符栈。

void InitStack1(SqStack *s);

操作结果:初始化运算数栈。

void InitStack1(SqStack *s);

操作结果:初始化运算符栈。

char GetTop(SqStack s)

操作结果:若栈不空,则返回运算符栈栈顶元素,否则返回ERROR。

int GetTop1(SqStack1 s)

操作结果:若栈不空,则用,否则返回ERROR。

void PushS(SqStack &s, char e)

操作结果:插入元素e为新的运算符的栈顶。 void PushS1(SqStack1 &s, int e)

操作结果:插入元素e为新的运算数栈顶。

int pop(SqStack &s, char &e)

操作结果:若运算符栈不空,则删除s的栈顶元素,用e返回其值,并返回OK,否则返回ERROR。

int pop1(SqStack1 &s, int &e)

操作结果:若运算数栈不空,则删除s的栈顶元素,用e返回其值,并返回OK,否则返回ERROR。

6、程序清单

#include

using namespace std;

#define STACK_INIT_SIZE 100

#define STACKINCREMENT 10

#define ERROR 0

#define OK 1

typedef struct /* 运算符栈 */

{

char *base, *top;

int stacksize;

}SqStack;

typedef struct /* 运算数栈 */

{

int *base, *top;

int stacksize; }SqStack1;

int priority[7][7] = { { '>', '>', '<', '<', '<', '>', '>' },// + 0

{ '>', '>', '<', '<', '<', '>', '>' },// - 1

{ '>', '>', '>', '>', '<', '>', '>' },// * 2

{ '>', '>', '>', '>', '<', '>', '>' },// / 3

{ '<', '<', '<', '<', '<', '=', },// ( 4

{ '>', '>', '>', '>', ' ', '>', '>' },// ) 5

{ '<', '<', '<', '<', '<', ' ', '=' }// # 6

};

/*用于比较符号优先级的全局二维数组*/

void InitStack(SqStack &s)//初始化运算符栈

{

= (char *)malloc(STACK_INIT_SIZE*sizeof(char));

if (!exit(OVERFLOW);

= ;

= STACK_INIT_SIZE;

}

void InitStack1(SqStack1 &s)//初始化运算数栈

{

= (int *)malloc(STACK_INIT_SIZE*sizeof(int));

if (!exit(OVERFLOW);

= ;

= STACK_INIT_SIZE;

}

void PushS(SqStack &s, char e)//插入元素e为新的运算符栈的栈顶 {

if - >=

{

=(char *)realloc, + STACKINCREMENT)*sizeof(char));

if (!exit(OVERFLOW);

= + ;//指向栈顶

+= STACKINCREMENT;

}

*++ = e;

}

void PushS1(SqStack1 &s, int e)//插入元素e为新的运算数的栈顶

{

if - >=

{

= (int *)realloc, + STACKINCREMENT)*sizeof(int));

if (!exit(OVERFLOW);

= + ;//指向栈顶

+= STACKINCREMENT;

}

*++ = e;

}//Push

char GetTop(SqStack s)//若栈不空,则返回s的栈顶元素,否则返回ERROR

{

if == return ERROR; return * - 1);

}

int GetTop1(SqStack1 s)//若栈不空,则用e返回s的栈顶元素,否则返回ERROR

{

if == return ERROR;

return * - 1);

}

int pop(SqStack &s, char &e)//若栈不空,则删除s的栈顶元素,用e返回其值

{

if == return ERROR;

e = *;

return OK;

}

int pop1(SqStack1 &s, int &e)//若栈不空,则删除s的栈顶元素,用e返回其值

{

if == return ERROR;

e = *;

return OK;

}

int number(char a)//将运算符的位置转化为数字以便于在二维数组中找到优先级 {

switch (a)

{

case '+': return 0;

break;

case '-': return 1;

break;

case '*': return 2;

break;

case '/': return 3;

break;

case '(': return 4;

break;

case ')': return 5;

break;

case '#': return 6;

break;

default:

return ERROR;

}

}

char precede(char a, char b)

{

int i, j; i = number(a);

j = number(b);

return priority[i][j];

}

int Operate(int a, char c, int b)//计算表达式结果并返回其值

{

switch (c)

{

case'+':

return a + b;

case'-':

return a - b;

case'*':

return a*b;

case'/':

return a / b;

default:

return ERROR;

}

}

int input(SqStack &s, SqStack1 &s1)//完成表达式的输入与计算

{

char c1, c2;