C++实现简单的表达式求值程序

该博客介绍了一个利用栈实现的简单表达式求值程序。程序通过键盘输入包含加、减、乘、除、求模、开方和乘方运算的表达式,用两个栈分别存储运算符和操作数。当遇到等于号时,根据运算符优先级进行计算,输出最终结果或在遇到非法字符时给出错误信息。
摘要由CSDN通过智能技术生成

实验要求

实验目的

利用Stack开发一款简单的表达式求值软件

实验要求

  1. 通过键盘输入表达式,表达式可包含加(+)、减(-)、乘(*)、除(/)、求模(%)、开方(&)和乘方(^)运算,并能使用括号,最后以“=”结束
  2. 计算表达式,并在显示器上输出结果;如果表达式非法,则输出错误信息。

程序思路

  1. 建立两个栈(optr和opnd),分别用来存储运算符和操作数
  2. 通过键盘输入一个表达式
  3. 逐个判断表达式中的字符为数字,运算符还是其他非法字符,知道碰到等于符号
    (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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值