数据结构表达式求值(C++)

实验原理

image-20210525100116063

image-20210525100230132

image-20210525100402994

代码思路

  • 使用两个顺序栈编程,一个顺序栈用来存储操作数,一个顺序栈用来存储操作符

  • 关键为表达式求值函数的编写

    • 对该函数,循环结束条件为栈顶元素为’#’,且读入的字符也为’#’

    • 循环体

      • (1)判断是否为操作数,是操作数,则压入栈中读取下一个字符
      • (2)是操作符,则比较操作符的优先级
      • 操作符栈栈顶元素用t1表示,读入的字符用t2表示
      • (a)t1>t2,则t1弹出操作符栈,与此同时操作数栈弹出两个元素,进行运算操作,将结果压入操作数栈中,注意该操作不读取下一个字符
      • (b)t1 = t2,操作符栈弹出栈顶元素,读取下一个字符
      • ©t1<t2,t2压入操作符栈中,读取下一个字符
    • 接下来便是precede函数,isOptr函数,operate函数的编写

实验代码(采用C++面向对象编程)

stack.h

#ifndef STACK_H__
#define STACK_H__
#define MAXSIZE 20
template<class DataType>
class Stack
{
private:DataType *data;int top;int capacity;
public:Stack();//无参构造函数Stack(int sz);//有参构造函数~Stack();//析构函数DataType Pop();//弹出元素void Push(DataType elem);//压入元素DataType getTop();//得到栈顶元素bool isEmpty();//判断栈是否为空bool isFull();//判断栈是否为满class Empty{};//设置内置异常类class Full {};
};
typedef Stack<char> CharStack;
typedef Stack<int> IntStack;
int evaluatExpression(IntStack &opndStack, CharStack &optrStack);
#endif

stack.cpp

#include<iostream>
using namespace std;
#include "stack.h"template<class DataType>
Stack<DataType>::Stack()
{data = new DataType[MAXSIZE];top = -1;capacity = MAXSIZE;
}template<class DataType>
Stack<DataType>::Stack(int sz)
{data = new DataType[sz];top = -1;capacity = sz;
}template<class DataType>
Stack<DataType>::~Stack()
{delete[]  data;
}template<class DataType>
DataType Stack<DataType>::Pop()
{if (isEmpty()){throw Empty();}else{return data[top--];}
}template<class DataType>
void  Stack<DataType>::Push(DataType elem)
{if (isFull()){throw Full();}else{data[++top] = elem;}
}template<class DataType>
DataType Stack<DataType>::getTop()
{if (isEmpty()){throw Empty();}else{return data[top];}
}template<class DataType>
bool Stack<DataType>::isEmpty()
{if (top == -1){return true;}else{return false;}
}template<class DataType>
bool Stack<DataType>::isFull()
{if (top == MAXSIZE - 1){return true;}else{return false;}
}template class Stack<char>;
template class Stack<int>;int operate(int num1,char optr, int num2)
{switch (optr){case '+':return num1 + num2;break;case '-':return num2 - num1;break;case '*':return num2 * num1;break;case '/':return num2 / num1;break;}
}bool isOptr(char ch)
{switch (ch){case '+':return true;break;case '-':return true;break;case '*':return true;break;case '/':return true;break;case '(':return true;break;case ')':return true;break;case '#':return true;break;default:return false;break;}
}
//判断操作符的优先级,t1优先级高于t2优先级返回'>'
char  precede(char t1, char t2)
{char f;switch (t1){case '+':if (t2 == '*' || t2 == '/' || t2 == '('){f = '<';}else{f = '>';}break;case '-':if (t2 == '*' || t2 == '/' || t2 == '('){f = '<';}else{f = '>';}break;case '*':if (t2 == '('){f = '<';}else{f = '>';}break;case '/':if (t2 == '('){f = '<';}else{f = '>';}break;case '(':if (t2 == ')'){f = '=';}else if (t2 == '#'){f = ' ';}else{f = '<';}break;case ')':if (t2 == '('){f = ' ';}else{f = '>';}break;case '#':if (t2 == '#'){f = '=';}if (t2 == ')'){f = ' ';}else{f = '<';}break;}return f;
}
int evaluatExpression(IntStack &opndStack, CharStack &optrStack)
{char ch,optr;int num1, num2,res,temp;optrStack.Push('#');int isNum = 0;//判断前一个字符是否为数字cin >> ch;//循环结束条件,栈顶元素为'#',且读入的字符为'#'while (ch != '#' || optrStack.getTop() != '#'){if (!isOptr(ch))//操作数,压入数据栈中{if (isNum == 1){temp = opndStack.Pop();temp = temp * 10 + (ch - '0');opndStack.Push(temp);isNum = 1;cin >> ch;}else {isNum = 1;opndStack.Push(ch - '0');cin >> ch;}}else//操作符,比较优先级{isNum = 0;switch (precede(optrStack.getTop(),ch)){case '>'://栈顶元素出栈,操作数栈弹出2个元素num1 = opndStack.Pop();num2 = opndStack.Pop();/*cout << num1 << "\t";cout << num2 << endl;*/optr = optrStack.Pop();res = operate(num1, optr, num2);opndStack.Push(res);break;case '<':optrStack.Push(ch);cin >> ch;break;case '=':optrStack.Pop();cin >> ch;break;}}}return opndStack.Pop();
}

main.c

#include<iostream>
using namespace std;
#include "stack.h"
//表达式求值
int main()
{CharStack optrStack;IntStack opndStack;NELEMTYPE res;cout << "请输入算数表达式以#结束" << endl;res = EvaluateExpression(optrStack, opndStack);cout << res << endl;return 0;
}

运行结果

image-20210525101223537

image-20210525101334542

参考链接

b站up主:laura柳

image-20210525100818814

b站up主:跟懒猫老师快乐数据结构

image-20210523104641877

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261460.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国互联网大佬江湖拼什么?拼财力拼出身拼前景拼造势

创业者千千万&#xff0c;大佬的椅子却有限。 马云、李彦宏、马化腾、雷军、周鸿祎、丁磊、张朝阳……大浪淘沙之中&#xff0c;他们挺住了&#xff0c;前进了&#xff0c;成功了。纵观互联网大佬修炼过程&#xff0c;虽然有机缘巧合&#xff0c;背后仍然有道可依。 表面风平浪…

Javascript中正则表达式的全局匹配模式

先看一道JavaScript题目&#xff0c;据说是国内某知名互联网企业的JavaScript笔试题&#xff0c;如果对正则的全局匹配模式不了解的话可能会对下面的输出结果感到疑惑。 View Code varstr "123#abc";varre /abc/ig;console.log(re.test(str)); //输出tureconsole.lo…

捕捉所有异常_详解Java中异常的分类

下面介绍几种常见的异常类型&#xff0c;便于在出错时对程序进行查错&#xff1a;&#xff08;1&#xff09;Exception 各种异常的根类如果你不知道将发生的异常集体属于哪&#xff0c;而可以肯定种这个地方会出现异常时&#xff0c;可以把异常类型定义为Exception。&#xff0…

2ASK调制与解调(包含maltab代码)

实验原理 实验代码 信噪比为20db时代码: clear all; close all; %%%%%%% parameter settings %%%%% Rb 1000;%比特率 Rs 1000;%符号率 Fs 10000;%采样频率 N 100000;%原始消息信号的长度 UpSampleRate Fs/Rs; % 一个符号周期内采样点数 RollOff 0.25; Spa…

XAML 编码规范 (思考)

<?xml version"1.0" encoding"UTF-8"?> 1.尽量和Blend统一2.兄弟元素之间需要空行4.父子元素之间不需要空格3.每行尽量单个属性5.Grid的Row和Column定义不需要空行6.Style里的Setter中不需要单行一个属性7.Trigger里的Binding和Conditions中不需要…

数据结构银行排队问题

实验任务 银行排队模拟程序功能 假设某银行有四个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口只能接待一个客户&#xff0c;因此在客户人数众多时需在每个窗口前顺次排队&#xff0c;对于刚进入银行的客户&#xff0c;如果某个窗口的业务员正在空闲&a…

STL vector容器

介绍 这篇文章的目的是为了介绍std::vector&#xff0c;如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用&#xff0c;如在remove_if()和for_each()中的使用。通过阅读这篇文章读者应该能够有效地使用vector容器&#xff0c;而且应该不…

通讯中断 pc_S7程序RFID 与PC连接区别FB 65/UDT65

同样是使用使用FB65但RFID与PC的连接DB用法有一定的区别:首先说一下什么是FB65:通过TCP和ISO on TCP使用两个通信伙伴都调用FB 65 "TCON"来设置和建立通信连接。在这些参数中&#xff0c;您要指定哪个伙伴是主动通信传输点、哪个伙伴是被动通信传输点。设置并建立连接…

JavaScript 设计模式之构造函数模式

一、构造函数模式概念解读 1.构造函数模式概念文字解读 构造函数用于创建特定类型的对象——不仅声明了使用的对象&#xff0c;构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值。你可以自定义自己的构造函数&#xff0c;然后在里面声明自定义类型对象的属性或…

列表异步线程加载图片

手机客户端以列表形式展示数据是非常常见的一种方式。然而列表中要显示图片&#xff08;比如&#xff1a;头像&#xff09;就要采用异步线程加载的方式&#xff0c;这样做是为了防止加载图片数据的时候&#xff0c;花费时间过长&#xff0c;阻塞UI线程&#xff0c;从而达到保持…

matlab连续卷积动画实现(gui编程)

一.代码运行结果 二.代码 function varargout tianqi(varargin) % TIANQI MATLAB code for tianqi.fig % TIANQI, by itself, creates a new TIANQI or raises the existing % singleton*. % % H TIANQI returns the handle to a new TIANQI or the handle t…

sql2005备份还原详解

1、备份 点击要备份的数据库右键-任务-备份 备份类型&#xff1a;完整 2、还原 点击数据库右键-还原数据库 目标数据库&#xff1a;&#xff08;数据库名&#xff09; 选择 原设备&#xff1a;&#xff08;你备份的xxx.bak文件&#xff09; 在选…

python爬虫框架怎么安装_celery如何在python爬虫中安装?

在我们学习了不少关于celery框架的知识后&#xff0c;很多小伙伴已经想要正式使用celery了。这里小编也不知道大家安装好了celery没有~为了照顾一下动手能力不太强的python小白&#xff0c;小编把celery框架安装的方法整理了出来&#xff0c;没有安装成功的小伙伴也可以参考一下…

codeforces C. Diverse Permutation(构造)

题意&#xff1a;1...n 的全排列中 p1, p2, p3....pn中&#xff0c;找到至少有k个|p1-p2| , |p2-p3|, ...|pn-1 - pn| 互不相同的元素&#xff01; 思路&#xff1a; 保证相邻的两个数的差值的绝对值为单调递减序列..... 如果够k个了&#xff0c;最后将没有访问到的元素直接添加…

(转)父子节点遍历

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://qianzhang.blog.51cto.com/317608/1205679 对于树/图的遍历&#xff0c;通常有2种算法来实现&#xff1a;迭代(Iteration)和递归(Recursi…

SharePoint 2007 做Migration后用户处理

新公司的一部分任务是做Migration&#xff0c;从用户角度来说分为两种情况&#xff0c;第一种是在同一个Domain下作网站的Migration&#xff0c;另外一种就是在不同Domain下做Migration。在同一Domain下做Migration&#xff0c;User不会出现问题&#xff0c;因为在Import后&…

Ubuntu GNOME 15.10升级16.4LTS

为什么80%的码农都做不了架构师&#xff1f;>>> 当Ubuntu GNOME官方已经发送16.4后&#xff0c;执行以下命令 sudo do-release-upgrade 显示没有新系统更新 在网上找到另一种方法是执行以下命令&#xff1a; sudo ppa-purge ppa:gnome3-team/gnome3-staging sudo p…

matplotlib plot 分组_小白学 Python 数据分析(16):Matplotlib(一)坐标系

人生苦短&#xff0c;我用 Python前文传送门&#xff1a;小白学 Python 数据分析(1)&#xff1a;数据分析基础小白学 Python 数据分析(2)&#xff1a;Pandas (一)概述小白学 Python 数据分析(3)&#xff1a;Pandas (二)数据结构 Series小白学 Python 数据分析(4)&#xff1a;Pa…

hdu 1423 最长公共递增子序列

这题一开始把我给坑了&#xff0c;我还没知道LCIS的算法&#xff0c;然后就慢慢搞吧&#xff0c;幸运的是还真写出来了&#xff0c;只不过麻烦了一点。 我是将该题转换为多条线段相交&#xff0c;然后找出最多多少条不相交&#xff0c;并且其数值死递增的。 代码如下&#xff1…

安卓从业者应该关注:Android 6.0的运行时权限

Android 6.0&#xff0c;代号棉花糖&#xff0c;自发布伊始&#xff0c;其主要的特征运行时权限就很受关注。因为这一特征不仅改善了用户对于应用的使用体验&#xff0c;还使得应用开发者在实践开发中需要做出改变。 没有深入了解运行时权限的开发者通常会有很多疑问&#xff0…