实验要求
实验目的
利用Stack开发一款简单的表达式求值软件
实验要求
- 通过键盘输入表达式,表达式可包含加(+)、减(-)、乘(*)、除(/)、求模(%)、开方(&)和乘方(^)运算,并能使用括号,最后以“=”结束
- 计算表达式,并在显示器上输出结果;如果表达式非法,则输出错误信息。
程序思路
- 建立两个栈(optr和opnd),分别用来存储运算符和操作数
- 通过键盘输入一个表达式
- 逐个判断表达式中的字符为数字,运算符还是其他非法字符,知道碰到等于符号
(1) 若为数字,将其push进操作数栈(opnd),继续处理下一个字符。
(2) 若为运算符,比较此运算符(栈外优先级)与运算符栈(optr)中最顶端元素(栈内优先级)的优先级。
(3) 若栈内优先级低于栈外优先级,则将当前字符push入运算符栈(optr), 继续处理下一个字符。
(4) 若栈内优先级高于栈外优先级, 从操作数栈(opnd)中pop出2个操作数,从运算符栈(optr)中pop出最顶端运算符进行计算,并将计算结果push进操作数栈(opnd) ,继续处理当前字符。
(5) 若栈内优先级等于栈外优先级, 从运算符栈(optr)中pop出最顶端运算符, 继续处理下一个字符。
(6) 若为其他字符, 输出提示表达式非法, 退出程序。
输出最终运算结果,即操作数栈(opnd)中的栈顶元素。
代码
Link.h
#pragma once
template<class E>
struct Link {
E entry;
Link<E> *next;
Link() {
next = NULL; }
Link(E item, Link<E> *add_on = NULL) {
entry = item;
next = add_on;
}
};
Stack.h
#pragma once
#include"Link.h"
template<class E>
class Stack {
protected:
Link<E> *top_Link;
public:
Stack() {
top_Link = NULL;
}
/*判断是否为空栈*/
bool empty() const {
if (top_Link == NULL)
return true;
else
return false;
}
/*入栈*/
bool push(const E &item) {
Link<E> *new_top = new Link<E>(item, top_Link);
if (new_top == NULL)
return false;
top_Link = new_top;
return true;
}
/*出栈*/
bool pop() {
Link<E> *old_top = top_Link;
if (top_Link == NULL)
return false;
top_Link = old_top->next;
delete old_top;
return true;
}
/*取栈顶元素赋给形参*/
bool top(E &item) const {
if (empty())
return false;
else {
item = top_Link->entry;
return true;
}
}
/*清空栈*/
void clear() {
while (!empty())
pop();
}
/*析构函数*/
~Stack() {
clear(); }
};
Calculate.cpp
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include"Link.h"
#include"Stack.h"
using namespace std;
template<class