数据结构表达式求值(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…

数据结构银行排队问题

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

通讯中断 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…

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…

2016-04-29 二分查找的面试题

为什么80%的码农都做不了架构师&#xff1f;>>> 1.面试题 例如&#xff1a; ip计算后的值&#xff1d;53文本内容&#xff1a;1,100,北京 101,1000,上海 1001,3001,广州 ...求ip53对应的省份2.代码如下&#xff1a; #!/usr/bin/python # coding: utf8def ip_find(i…

gettype拿不到值_王者荣耀:被低估的强势打野,就是这位拿大锤子的阿姨!

王者峡谷的小伙伴你们好&#xff0c;今天就为你们推荐一下这位野区女霸主钟无艳&#xff0c;不仅高伤害而且操作简单&#xff01;版本更新在5月14日版本更新中&#xff0c;钟无艳的三个技能都被加强了&#xff0c;所有的蓝耗都被固定&#xff0c;不再随技能等级的成长值&#x…

【笔记】MATLAB中的图形(2)

三维作图 1、mesh(z)语句 mesh(z)语句可以给出矩阵z元素的三维消隐图&#xff0c;网络表面由z坐标点定义&#xff0c;与前面叙述的x-y平面的线格相同&#xff0c;图形由临近的点连接而成。它可用来显示用其他方式难以输出的包含大量数据的大型矩阵&#xff0c;也可以用来绘制z变…

Kindeditor放置两个调用readonly错误

开始 需要调用Kindeditor中的readonly的方法&#xff0c;但是一直提示edit is undefined 而editor.readonly(true)又只对第一个对象有效 所以只能换换形式&#xff0c;干脆将下面的kindeditor拿上来 虽然是满足自己这个需求&#xff0c;但是真正的原因解决办法&#xff0c;还是…

acl在内核里的位置_Linux 进程在内核眼中是什么样子的?

本篇算是进程管理的的揭幕篇&#xff0c;简单介绍一个进程在内核眼里的来龙去脉&#xff0c;为接下来的进程创建&#xff0c;进程调度&#xff0c;进程管理等篇章做好学习准备。从程序到进程再到内核啥是程序&#xff0c;啥是进程&#xff0c;一张图可以给我们解释&#xff1a;…

majikan

转载于:https://www.cnblogs.com/YOUEN/p/3179091.html

经典中的品味:第一章 C++的Hello,World!

“程序设计要通过编写程序的实践来学习”—Brian Kernighan 1.1 程序 何为程序?简单的说&#xff0c;就是为了使计算机能够做事&#xff0c;你需要在繁琐的细节中告诉它怎么做。对于怎么做的描述就是程序。编程是书写和测试怎么做的过程。维基百科上说&#xff0c;一个程序就像…

使用eclipse svn塔建(配置)时的一点点心得

有没有人遇到下面这种情况&#xff1f;&#xff1f;自己创建的SVN如下&#xff1a; 但网上别人搭建好的是这样子的&#xff1a; 就是为什么我的只有个主文件&#xff0c;而没有src、webroot、meta-inf、web-inf等子文件呢&#xff1f;&#xff1f; 这是我找了很多网上的资料&am…

实例构造器和类(引用类型)

构造器是允许将类型的实例初始化为良好状态的一种特殊方法。构造器方法在“方法定义元数据表”中始终教.ctor。创建一个引用类型的实例时&#xff0c;首先为实例的数据字段分配内存&#xff0c;然后初始化对象的附加字段&#xff08;类型对象指针呵呵同步块索引&#xff09;&am…