数据结构写程序实现表达式求值算法

 我来答
blacop
2017-04-01 · TA获得超过584个赞
知道小有建树答主
回答量:171
采纳率:0%
帮助的人:101万
展开全部

这是c++的代码

0 stdafx.h

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

//#pragma once是一个比较常用的C/C++杂注,只要在头文件的最开始加入这条杂注,就能够保证头文件只被编译一次。
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <math.h>
#include <time.h>
using namespace std;

// TODO:  在此处引用程序需要的其他头文件


1 stack栈的结构

#pragma once
#include "stdafx.h"
#include "StackNode.h"

//LinkStack,链式栈的类定义
template <typename T>
class Stack {
private:
StackNode<T>* top; //cur ptr
// 7个方法
public:
//Construct Function()
Stack() :top(NULL) {}
//DeConstruct Function()
~Stack() {
StackNode<T>* p; //temp ref domain  
while (top != NULL) { //free()
p = top;
top = top->next;
delete p;
}
}
//Push() 从栈顶压入一个元素
void Push(const T & item) {
StackNode<T> * p = new StackNode<T>;
p->data = item; //赋值
p->next = top; //connect cur ptr
top = p; //cur ptr move ++
}
//Pop() 从栈顶弹出一个元素
T Pop() {
if (IsEmpty()) { //empty stack
cerr << "Attempt to pop an empty stack!" << endl;
exit(1);
}
StackNode<T>* p = top; //temp ref domain
T RetValue = p->data; //temp data domain
top = top->next; //top-- move
delete p; //free() p, else will crash memory
return RetValue;
}
//Peek(),GetTop()
T Peek() const {
if (IsEmpty()) { //empty stack
cerr << "Attempt to pop an empty stack!" << endl;
exit(1);
}
return top->data;
}//!_Peek
//Clear()
void Clear(void) {
//不free()会内存泄漏
StackNode<T>* p; //temp ref domain  
while (top != NULL) { //free()
p = top;
top = top->next;
delete p;
}
this.top = NULL; 
}//!_Clear()
 //IsEmpty()
int IsEmpty(void) const {
return top == NULL;
}//!_IsEmpty()
};//!_class Stack


2表达式求值算法

#pragma once
#include "stdafx.h"
#include "Stack.h"
//方法的声明实现的 分离写法 容易 报错,IDE还找不到错误的地方

//表达式求值
class Calculator {
private:
//Calculator's stack,运算存储区
Stack<double> s;
//7个方法
public:
//建立一个空计算器栈
Calculator(void) {}
//De建立一个空计算器栈
virtual ~Calculator() {}
//将一个double型操作数压入堆栈
void Enter(double operand) {
s.Push(operand);
}
//弹出2个操作数
void GetTwoOperands(double &operand1, double &operand2) {
if (s.IsEmpty()) {
cerr << "No operand to be pop !" << endl;
s.Clear();
exit(1);
}
operand1 = s.Pop();
if (s.IsEmpty) {
cerr << "No operand to be pop !" << endl;
s.Clear();
exit(1);
}
operand2 = s.Pop();
}
//操作符运算
void Compute(char op) {
double operand1, operand2, result;
GetTwoOperands(operand1, operand2);
switch (op) {
case '+': result = operand1 + operand2; break;
case '-': result = operand1 - operand2; break;
case '*': result = operand1 * operand2; break;
case '/': if (operand2 == 0) {
cerr << "Divided by 0 !" << endl;
s.Clear();
exit(1);
} else
result = operand1 / operand2; break;
default:
break;
}
s.Push(result);
}
//清空栈
void Clear() {
s.Clear();
}
//计算表达式的值
void Run() {
char op; //操作符
double operand; //操作数
cin >> op; //输入操作符
while (op != '=') {
switch (op) {
case'+':case'-':case'*':case'/':
Compute(op); break; //运算
default:cin.putback(op); //非操作符,回流
cin >> operand; //入操作数
Enter(operand); break; //入栈操作数
}
cin >> op; //输入操作符
}
cout << s.Pop() << endl;//最后出栈
Clear();//清空栈
}
};//!_class Calculator
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式