学习日记 栈(2)表达式求值
optr(string)运算符 opnd(operand)操作数
getchar()函数功能:一个一个地读取你所输入的字符。例如,你从键盘输
入‘aabb’这四个字符,然后按回车,按了回车之后,这四个字符会被存储到键盘缓冲区,这个时候你使用getchar()函数,他会从键盘缓冲区里一个一个去读取字符。另外,getchar()函数的返回值,是你所输入字符的ASCII值。
getchar()!=EOF这条指令会读取你输入的数据直到没有数据可以读入为止(EOF代表的是在操作系统中表示资料源无更多的资料可读取)
getchar()!=’\n’这条指令会读取你输入的数据直到你按回车为止
算法步骤
- 初始化OPTR栈和OPND栈 将表达式起始符“#”压入OPTR栈
- 扫描表达式 如果OPTR栈栈顶元素不为“=”时,则循环
1.若读入字符不是运算符 则压入操作数栈
2.若是,则先与栈顶元素的优先级比较
若是小于 则压入OPTR栈 开始读下一字符
若是大于 则弹出OPTR栈顶运算符 从OPND栈弹出两个数 进行相应运算 压入OPND栈
若是等于 则OPND栈 栈顶元素为“(”且读入的为”)” 这时弹出栈顶元素“(” 匹配成功,脱括号 读下一字符
将栈的定义和实现保存在头文件“zhan.h”,然后再表达式求值的源程序中包含此头文件
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
typedef int operand;
typedef char operate;
typedef struct{
operate *base;
operate *top;
int stacksize;
}Sqstack_optr;//OPTR运算符栈类型
typedef struct{
operand *base;
operand *top;
int stacksize;
}Sqtack_opnd;//OPND操作数栈类型
然后是表达式求值源代码
#include "stack1.h"
//优先级表
char OprRelation[7][7] = {
{
'>', '>', '<', '<', '<', '>', '>'}, //'+'
{
'>', '>', '<', '<', '<', '>', '>'}, //'-'
{
'>', '>', '>', '>', '<',