操作数

【算法#4】表达式求值

吃可爱长大的小学妹 提交于 2019-12-04 04:07:32
最讨厌这种造计算器的题了…… 最近被这种造计算器的题坑了几次,一个还是普及-的题。表达式有很多,但是我们在面对狗屎的中缀表达式的时候有没有一些确定的原则? 有。其中一个就是在操作符入操作符栈之前,操作符栈顶的操作符优先级一定得严格低于该操作符优先级,否则弹出操作符并且对操作数栈的栈顶数进行运算直到栈空或者当前优先级严格大于栈顶操作符优先级。当然,前提是你采用这种求值方法,其他的东西暂不予考虑。 首先,我们遇到操作数时,读入操作数并且将操作数加入操作数栈,当我们读入操作符时,弹出操作符栈栈顶元素直到栈顶元素优先级严格小于当前操作符优先级或者栈空。 读入表达式完毕后,注意此时要是末尾是个操作数记得加入操作数栈,持续弹出操作符栈栈顶元素并且进行计算直到栈空。这样在操作数栈中有且仅有1个的元素就是表达式的值了。 其他的还有当遇到一个左括号时,直接加入操作符栈,当遇到一个右括号时持续弹出操作符直到遇到一个左括号或者栈空(致命错误)。 板子贴在这里,不是特别完整,只支持+和*运算,只能输入正整数。其实就是那个普及-的题的代码,稍微魔改一下就可以了。 print(input()) (雾) 下面这个是板子。 #include<bits/stdc++.h> using namespace std; long long stao[100005],top1,stan[100005],top2,temp;

C++的逆波兰表达式的求解

梦想的初衷 提交于 2019-12-04 02:09:53
逆波兰表示法 (Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家 扬·武卡谢维奇 1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。 逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构和减少计算机内存访问。逆波兰记法和相应的算法由澳大利亚哲学家、计算机学家查尔斯·汉布林(Charles Hamblin)在1960年代中期扩充 在1960和1970年代,逆波兰记法广泛地被用于台式计算器,因此也在普通公众(工程、商业和金融领域)中使用(百度百科)。 算法: 一、 将中缀表达式转换成后缀表达式算法: 1、从左至右扫描一中缀表达式。 2、若读取的是操作数,则判断该操作数的类型,并将该操作数存入操作数堆栈 3、若读取的是运算符 (1) 该运算符为左括号"(",则直接存入运算符堆栈。 (2) 该运算符为右括号")",则输出运算符堆栈中的运算符到操作数堆栈,直到遇到左括号为止。 (3) 该运算符为非括号运算符: (a) 若运算符堆栈栈顶的运算符为括号,则直接存入运算符堆栈。 (b) 若比运算符堆栈栈顶的运算符优先级高或相等,则直接存入运算符堆栈。 (c)

组合模式

我怕爱的太早我们不能终老 提交于 2019-12-03 13:24:38
组合模式 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。 介绍 意图: 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 主要解决: 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 如何解决: 树枝和叶子实现统一接口,树枝内部组合该接口。 关键代码: 树枝内部组合该接口,并且含有内部属性 List,里面放 Component。 应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container

2.6-MIPS指令简介

走远了吗. 提交于 2019-12-03 11:54:12
  MIPS秉承着指令数量少, 指令功能简单的设计理念,那这样的设计理念 是如何实现的呢?在这一节,我们就将来分析MIPS指令的特点。   相比于X86指令所提供的动辄上千页的指令说明,MIPS指令 只用这两页纸就可以说清楚了。MIPS指令的基本格式 就分为这三种,R型,I型和J型。R型指的是寄存器型, I型指的是立即数型,J型指的是转移型。 我们用这张表对MIPS的指令进行不同纬度的分类,横轴是按照指令的格式 分为R型、I型和J型,纵轴则是根据指令的功能类型分为运算指令、 访存指令和分支指令。首先,我们来看指令格式为R型的运算指令。 R型指令总共包含六个域,其中最高位的opcode域 是六个比特,最低位的funct域也是六个比特, 中间的四个域,均为五个比特,我们分别来看各个域的用途。 opcode域,用于指定指令的类型,对于所有的R型指令,这个域的值,均为零, 但这并不是说明R型指令只有一种,它还需要用funct域来更为精确的指定指令的类型。所以说,对 于R型指令,实际上一共有12个比特操作码, 那大家可以思考一下,为什么不将opcode域和funct域合并成一个12比特的域呢? 那样岂不是更直观明了吗?我们再来看这些5比特的域。 RS域,这个域通常用来指定第一个源操作数所在的寄存器编号, rt域通常用来指定第二个源操作数所在的寄存器的编号,

2.4-复杂的x86指令举例

天大地大妈咪最大 提交于 2019-12-03 11:51:57
  x86作为复杂指令系统的代表,自然会有不少相当复杂的指令。 在这一节我们将会看到其中有代表性的一些例子。   串操作指令是将存储器中的数据串进行每次一个元素的操作。 所谓一个元素可以是字节或者是字。 这个串可以很长,能够达到64KB,x86提供了5种不同的串操作指令, 并且还有3种重复前缀,可以与串操作指令配合使用。 这张表就展示了这5种串操作指令和3种重复前缀。 我们来选择其中一组进行介绍。这个指令的格式非常简单,没有任何的操作数, 它的功能就是在存储器中将指定位置的一个字节单元传送到存储器的另一个指定的位置。 与它配合的经常是这个重复前缀REP, x86的体系结构中有很多种的前缀,这个前缀的 涵义是当CX寄存器的值不等于0时,就重复执行这个串操作指令。 那么很奇怪的是这个指令没有任何操作数。其实大家要注意x86当中有很多 这样的没有操作数的指令,但这并不意味着它们比那些有操作数的指令要简单。 因为它们不写操作数,不是因为没有操作数,很可能是因为操作数太多了,实在在指令中写不下, 因此它们实际上是有一些隐含的操作数。 对于这这条串传送指令,它要传送的数据串称为源串。 源串的地址默认放在DS:SI这组寄存器指向的位置。 而要传送的目的,我们称为目的串地址,默认放在 ES:DI这组寄存器指向的位置, 而要传送的串的长度则放在CX寄存器当中。 我们可以看到,虽然没有写操作数

2.3-X86指令简介

痴心易碎 提交于 2019-12-03 11:50:06
  x86指令种类繁多,数量庞大, 在这一节我们将会学习x86指令的分类,并分析其中最为基础的一部分指令。 通常一个指令系统主要包括这几类指令。 运算指令,比如加、减、乘、除这样的算术运算,以及与、或、非这样的逻辑运算。 还有传送类指令,比如把数据从存储器送到通用寄存器,或者从通用寄存器送到I/O接口等等。 有了这两类指令,计算机就可以从外界获取数据, 并在内部完成运算,最后将结果输出到外界。但是如果你想编制比较复杂的程序,例如像高级语言当中if e lse这样的语句,或者是for while这样的循环语句, 那就需要用到转移类指令,另外还需要有一些对CPU进行控制的指令。 那无论是哪一类指令,我们首先要关心的就是它究竟改变了什么。 例如一条加法指令,它会改变通用寄存器的内容, 或者有可能改变标志位,再有是改变存储器单元的内容,或者改变外设端口的内容, 还有可能改变指令指针以及其他的情况。 那我们在学习到新的指令的时候,一定要认真地想清楚这条指令 究竟改变了哪些地方,又对后续的指令会产生什么样的影响。   现在我们就通过一个示例程序来讲解几个常用的指令。 这个程序的目的是进行两个数的求和运算, 这两个数比较大,可能有很多个字节,第一个数存放在2000H开始的 存储器空间中,第二个数存放在3000H开始的存储器空间中。 而且我们希望这个程序有一定的灵活性,可以适应不同长度的数。

含有+-*/()的表达式求值

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-03 09:13:44
对于表达式,有常用的几种形式: 中缀表达式(Infix expression):操作符位于两个操作数中间,算术表达式的常规表示法。 需要用括号和优先规则排除多义性。(这也正是编写程序的麻烦点,需要制定完整的优先规则) (A+B)*C-D/(E+F) 后缀表达式(Postfix expression),逆波兰表示法,操作符位于操作数后面。这种方法使表达式求值很方便。AB+C*DEF+/- 。 前缀表达式(Prefix expression):也叫波兰表示法,操作符写在操作数的前面。这种方法常用于编译器设计方面。-*+ABC/D+EF (在这里,不考虑前缀表示法) 为了简化问题,关注算法,本文的讨论基于以下三点: 只考虑 + - * / ( ) 这几个基本运算符。 运算数只考虑 0-9,这10个简单的数,方便从string中取出来。 输入的表达式没有语法错误。 现在先不考虑求值,先来考虑一个有趣的东西:表达式树 先考虑最简单的表示法:如果给出后缀表达式,AB+C*DEF+/- 算法思路: 给出后缀表达式S;建立一个栈,数字栈stack1。 循环读入表达式的每一个单元: 如果读入的字符是数字,那么入栈; 如果读入的字符是符号,那么弹栈两次,后弹出来的记为n1,先弹出来的记为n2;那么结果就为n1-n2;然后将结果入栈。 最后在栈中会得到最终结果。 因为后缀表达式不需要进行优先级规则的判断

汇编一

為{幸葍}努か 提交于 2019-12-03 08:12:22
1: 基本结构 DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS ;段寻址伪指令用来指明段与段寄存器的对应关系 START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 MOV AH,4CH ; INT 21H ; dos系统调用系统终端 执行AH程序中程序退出指令 CODES ENDS END START ; 指定开始的地址 2:基本指令    一、数据传送指令 1、传送指令:MOV (move) (1) CPU内部寄存器之间的数据传送,如:mov ah,al (2) 立即数送至通用寄存器(非段寄存器)或存储单元,如:mov al,3 mov [bx],1234h (3) 寄存器与存储器间的数据传送,如:mov ax,var mov ax,[bx] 二、堆栈操作指令 1、进栈指令:push 格式:push src 功能: 把16位数据src压入堆栈。 注: 源操作数src可以是通用寄存器和段寄存器,也可以是字存储单元 如: push si push [si] push var ;var是16位(字)变量 2、出栈指令:pop 格式:pop dst 功能

Assembly language 再读---续

雨燕双飞 提交于 2019-12-03 07:23:34
前面已经写到了第三章的数据类型 的那一部分 接下来是一些关于伪指令和其他杂七杂八的东西 1. 当前地址计数器: $     常用于 计算数组以及字符串的长度,如: .data list db 12,34234,453,45,43,5 listp db ($-list) ;代表的是数组元素所占内存空间的长度,也是一字为单元的数组的元素个数,;如要求元素大小为字,或双字,以及更大的数据类型则需要除以 type list 或者直接除以元素大小 2. 等号伪指令(=)与EQU和它的"小兄弟" TEXTEQU 区别:等号伪指令只能用于定义整数表达式,而EQU则有三种格式,如下 name equ expression name equ sybal name equ <text> 但是EQU不能重复定义,=则可以,与EQU相似的是TEXTEQU,他同样有三种格式,但它与EQU最大的不同的是他可重定义 3.大端储存格式与小端储存格式 4. 整数的全零扩展与符号扩展 MOVZX (全零扩展)与MOVSX(符号扩展) 这边符号扩展提一下,在将小数传送给大数时,符号扩展会将小数的最高位复制到大数的高位 5. LAHF和SAHF   LAHF:将EFLAGS的符号位,复制到AH中,   SAHF:将AH中的内容复制到EFLAGS(RFLAGS),加载状态标志 6. XCHG 交换数据  

何谓语句

大城市里の小女人 提交于 2019-12-03 06:45:16
初识语句 一、 运算符 1、 赋值运算符,( 1)基本运算符:只有一个“=”。它是java中唯一一个自右向左运算的符号;(2)扩展运算符, 格式:算术运算符 +基础运算符,主要有+=、*=、/=、%=。 ( 3)特点,缺点:不直观;优点:自动做强制类型转换,提高执行效率。 推荐使用扩展运算符。 2、 比较运算符(关系运算符), <、>、<=、>=、==、!= 。结果是布尔类型的值。 <、>、<=、>= 只能用于 byte、short、int、long、float、double、char类型的比较;==、!=可以引用类型类型的比较,也可以做基本类型的转换。 3、 逻辑运算符,( 1)该运算符的两边操作数的值必须为布尔类型的表达式,常见的有:&、|、!、^、&&、||;(2)&&两个操作数的值都是true,则结果为true,否则结果为false,与&用法一样;(3)||两个操作数得值都是false,则结果是false,否则结果是true,与|用法一样;(4)!是取反的意思,操作数的值为true,结果是false,操作数的值为false,结果是true;(5)&&常用来做短路与,如果前一个操作数是false,结果直接是false,后面的操作数不用执行;(6)||是短路或,如果前一个操作数是true,结果直接是true,后面的操作数不用执行;(7)推荐使用&&和||。 4、 条件运算符