上篇笔记我们已经知道了后缀表达式以及他的计算方法,本篇我会用代码实现利用栈计算后缀表达式。 计算步骤 初始化一个空栈。...此栈用来对要运算的数字进出使用 如果遇到符号就把栈上的两个元素拿出来计算然后再压栈 遇到数字就压栈,遇到符号就出栈两个数字然后计算 直到表达式结束 代码实现 #include #include...= '-' || c == '*' || c == '/') { return true; } return false; } PerformOperation函数是通过传入的操作符来计算栈上元素的...Isnumber判断参数是否是数字 IsOperator判断是否是操作符 整体逻辑 根据字符串从左面开始扫面(我这里用的是for循环你也可以用其他的循环) 如果是操作符,则pop栈顶两个元素进行运算...如果是数字,则把字符转成整数(因为后续要参加计算)并入栈,经过反复计算压栈,最后留在栈顶的就是我们要的结果。 eg:计算931-2*+52/+
(In) 表达式求值函数(evaluateExpression) 其他:操作符栈(OPTR),操作数栈(OPND) ---- 谈谈我遇到的问题: 1.该选择数字栈还是字符栈?...运算数是整型,而运算符是字符型,若选用字符栈,存入操作数时只能以‘0’–‘9’的字符形式存入,那么意味着无法存取两位以上的数字,也无法运算两位以上的数字,因为运算过程中的中间值超过两位也将无法转化成字符形态入栈计算...用gets(str);或者scanf进行字符串读入表达式后,存储方式如下: 多位数的存储方式: 我们可以通过str[i]进行逐位的访问,通过i++;实现逐位的偏移,那么就可以写成str...此时我们就成功的用归并将34读取入栈 ,接下来再看4位的数5473如何读取,首先X1读取5,归并至X2(第一次归并,此时X1=5;X2=5),接着让X1读取4,识别到X1是数字,归并至X2(第二次归并,...此算法用于计算整型,若要计算浮点数,把相应的类型更换成double即可实现。 算法运算逻辑是先以字符型读入字符数组中,再将字符型转换为整型存入数字栈中。
我们平时计算时列的计算式叫做中缀表达式,即运算符放在两个运算数中间的计算式(例:1+1)。...但是,这样的式子计算机并不能很好的理解,在遇到有括号加入时就会更难进行编程,于是在这样的需求下,另一种计算式被发明了:后缀表达式。...用移动的p_now指针来标识栈顶的位置。 接下来的重点,是如何将中缀表达式转化为后缀表达式。...首先,我们初始化两个栈,一个用于存放转换完成的式子(目标栈),另一个用于暂时存放操作符(操作符栈),并用一个字符指针来扫描字符串,用一个int来表示目前的扫描状态。 ?...这样我们便完成了转换中缀表达式的步骤了。然后就是如何计算后缀表达式呢。
如下图 根据用户输入的表达式,得出计算结果 思路分析 本题看似简单,实则不然,要实现这个功能我们不能简单的直接将这个字符串丢给程序 如下 int a = 7*2*2-5+1-5*3-3 // 3...我们要模拟计算机是如何解析,并计算出这样一个字符串的结果。...则直接入符号栈 4.当表达式遍历完毕时,就顺序的从数栈和符号栈中pop出相应的数和符号,并进行运算 5.最后数栈中只有一个数字,即最后的结果 图示 如下例计算 3+2*6-2 第一次扫描时,发现是数字,...,我们还得给栈添加几个方法 1.查看栈顶中的元素 2.计算符号优先级 3.判断是否为运算符 4.计算方法 ......,就顺序的从数栈和符号栈中pop出相应的数和符号进行计算 while (true){ //当符号栈为空时,说明计算到最后的结果了,数栈中只有一个数字即结果
基本计算器」,难度为「困难」。 Tag : 「表达式计算」 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。...双栈 我们可以使用两个栈 nums 和 ops 。...「在放入之前先把栈内可以算的都算掉」,使用现有的 nums 和 ops 进行计算,直到没有操作或者遇到左括号,计算结果放到 nums 一些细节: 由于第一个数可能是负数,为了减少边界判断。...,先把栈内可以算的都算了 while (!...,先把栈内可以算的都算了 while(!
1.什么是栈 先进后出,元素的删除和插入只能在同一端的一种线性表 2.栈的实现方式 数组和链表都可以,本次使用数组 3.什么是中缀表达式 3+2-1*6+10 4.代码: /** * @author...* @date 2020/2/13 */ public class Calcaulator { public static void main(String[] args) { // 中缀表达式...numStack.push(res); } System.out.printf("表达式 %s = %d ", expression, numStack.pop()); } } class...boolean isOper(char val) { return val == '+' || val == '-' || val == '*' || val == '/'; } /** * 计算...: 1.递归 2.方法调用 3.表达式的转化和求值 4.二叉树遍历 5.图的深度优先遍历 6.逆序输出 如 单链表的反转
题目描述 使用C++自带的stack栈模板来实现四则运算表达式求值 算法描述参考第3.2.5节 算法伪代码参考P53-54的算法3.4 例如 1....Pop(OPND, a); 表示弹出栈OPND的栈顶元素,并把栈顶元素放入变量a中。...(); 大家主要是改造表达式求值函数EvaluateExpression的代码 输入 第一个输入t,表示有t个实例 第二行起,每行输入一个表达式,每个表达式末尾带#表示结束 输入t行 输出 每行输出一个表达式的计算结果...,计算结果用浮点数(含2位小数)的格式表示 参考代码如下: #include #include using namespace std; int main...- ),那么需要开始计算这个运算符前面的数值,即两次弹出操作数栈栈顶元素用来计算,计算的运算符是当前运算符栈顶元素。
栈的应用----算术表达式计算问题(中缀转后缀,后缀计算) 问题引入:算术表达式计算是编译系统中的一个基本问题,其实现方法是堆栈的一个典型应用。任何一个算术表达式都是由操作数、运算符和分界符组成的。...算术表达式的计算分为两步: 中缀表达式转为后缀表达式 后缀表达式的计算。...4.计算过程 二、后缀表达式的计算 1.算法思想: 设置一个堆栈存放操作数,从左至右依次扫描后缀算术表达式,每读到一个操作数就将其进栈,每读到一个运算符就从栈顶取出两个操作数施以改运算符所代表的运算操作...,并把该运算结果作为一个新的操作数入栈,此过程一直进行到后缀算术表达式读完,最后栈顶的操作数就是改后缀算数表达式的运算结果。...可以看到,上述的分析过程和结果都正确,其实熟悉编译原理的同学可以直接用“移进”和“规约动作”实现中缀算数表达式到后缀算数表达式的转换。
中缀表达式转换为后缀表达式 后缀表达式 做数学运算时,经常使用的是中缀表达式,即“操作数 运算符 操作数”。在计算机处理的时候更习惯后缀表达式,即“操作数 操作数 运算符”。...例如a + b * c转换为后缀表达式a b c * +,使用栈可以将中缀表达式转换为后缀表达式,具体的方法为: 扫描到数字直接输出 扫描到运算符则与栈顶比较,若扫描到的运算符优先级低于或等于栈顶运算符的优先级...,则弹栈直到栈空或栈顶运算符优先级低于扫描到的运算符,之后运算符入栈;否则直接入栈。...base_stack.New_link_stack() topost := To_postfix{} topost.data_stack = link return &topost } 后缀表达式的计算...计算方法 后缀表达式的计算比较简单,顺序扫描整个后缀表达式: 若遇到数字,直接入栈 若遇到运算符,弹栈两次取出两个数字,按运算符运算,将结果再次入栈 这样扫描完整个后缀表达式之后,栈中就应该只有一个数
题目:[NOIP2013 普及组] 表达式求值 题目原文请移步下面的链接 https://www.luogu.com.cn/problem/P1981 参考题解:https://www.luogu.com.cn.../problem/solution/P1981 标签:OI、模拟、字符串、栈 思路 众所周知,像“+”这样的字符是用char来存储的,并且题目保证没有括号这种讨厌的东西扰乱优先级,所以也不用费尽心思搞个字符串再分割了...,直接交替输入值和符号就完了,如果是乘号就先算一下,保证运算优先级不被打破,反正它只有两种符号,算完乘法后再把其他数加一下就ok啦 看了题解,大家不约而同用栈实现,我的代码还是比较简洁的 AC代码 #
//下面的栈都是用C语言写的,为使用STL // 链式结构:表示队列 typedef int QDataType; typedef struct QListNode { struct QListNode...* int param_3 = myStackTop(obj); * bool param_4 = myStackEmpty(obj); * myStackFree(obj); */ 用栈实现队列...思路: 首先创建两个栈,一个栈用来入队列,一个栈用来出队列,出队列时,如果出队列的栈为空,则将入队列的栈中的元素弹出到出队列的栈再出队列,否则,直接出栈。...//栈为用 C语言所写 //栈只能先进后出 //每个元素最后进出的相对顺序不唯一,可以边进边出 typedef int STDataType; typedef struct Stack { int...* a; //存储栈内元素的数组 int top; // 标识栈顶位置的,代表栈顶元素的下一个位置(也可以代表是栈顶元素,但栈为空时top==-1) int capacity; }ST; void
例如:3+2*6-2 先定义两个栈,一个为数值栈,一个为运算符栈; stack.go package stack import ( "errors" "fmt" ) type Stack...operStack.Pop() result = operStack.Cal(num1, num2, oper) //将计算的结果重新入栈...if index == n-1 { break } //继续扫描 index++ } //如果表达式扫描完毕...numStack.Pop() oper, _ = operStack.Pop() result = operStack.Cal(num1, num2, oper) //将计算的结果重新入栈...numStack.Push(result) } res, _ := numStack.Pop() fmt.Printf("计算表达式 %v 的值是:%v\n"
栈的实现可以用链表或者数组实现 链表实现的话,push就往头节点插入,pop就删除头节点 这里用数组实现,需要三个成员变量,分别记录栈容量、栈顶索引(栈元素数量)、数组首地址 int volume...,然后栈顶移动,判断元素是否满了,满了就增长栈容量 void push(int value) { data[top] = value; ++top;...if (top == volume) { grow(); } } 如此一来top实际上是栈元素的个数 bool empty() const {...return top == 0; } bool size() const { return top; } pop的时候先看看栈是不是空的,不是空的就移动栈顶...,返回栈顶元素 int pop() { if (empty()) return -1; return data[--top]; }
描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。...true) { this.stack2ToStack1(); } return stack1.peek(); } } 原题地址 牛客网:用两个栈实现队列
题目描述 请你仅使用两个栈实现先入先出队列。...你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。 进阶: 你能否实现每个操作均摊时间复杂度为 O(1) 的队列?...,将原栈出栈在入栈,得到最先入栈的元素。...即最先出栈的元素。这方法不太好。...一个push_statck管入栈,一个pop_statck管出栈,这样出栈优先从pop内出,若pop没有元素,则将push_statck内元素装入入栈到pop_statck中,这样比法一省了很多步。
文章目录 题目介绍 思路分析 代码实现 C语言版本 C++版本 上一篇文章我们讲解了如何用队列实现栈,那这篇文章我们再来看一个兄弟题目——用栈实现队列 题目介绍 链接: link 仅使用两个栈实现先入先出队列...思路是这样的: 让我们用两个栈来实现 我们把其中一个栈命名为pushstack,只用来入数据(队尾入数据),另一个命名为popstack,只用来出数据(对头出数据) 比如我们现在入队列1 2...所以,总结一下: 队尾入数据的时候,永远把数据入到pushstack里面; 队头出数据的时候,要判断一下:如果popstack不为空,直接出栈popstack栈顶的元素即可,如果popstack为空...接着来看——pop:移除队头元素并返回 那这个其实就可以复用上面的peek函数,先调用一下peek接口,获取popstack栈顶的元素即队头元素作为返回值,当然返回之前再去pop掉popstack栈顶元素即可...代码实现 C语言版本 C语言实现的话,还是要自己造轮子,这里我就直接拷贝之前写过的栈: 接着是本题的代码实现: 然后 就过啦 C++版本 C++就可以直接用STL里面的stack,
//用正则表达式完成替换计算 //检验 if(Common.GetMatchStr(this.sumitem,@"\w+([+\-*/]\w+)*").Length
逆波兰表达式 可参照文章逆波兰表达式算法分析 若当前字符是操作数,则压栈 若当前字符是操作符,则弹出栈中的两个操作数,计算后仍然压入栈中C++代码实现 /* 后缀表达式(逆波兰表达式) 有效操作只有'+...Push(S, temp); temp = 0; } } else { if (IsOne(S)) { // 栈中只有一个元素 cout << "表达式有误...,无法计算!"...break; case '*': Push(S, b * a); break; case '/': if (a == 0) { cout << "被除数为零,无法计算...IsOne(S)) { cout << "表达式操作数过多!"
题目描述 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队列的基本操作...你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。...解题思路 假装queue是一个队列,将元素入队列后,则这个元素则是一个栈顶元素,但在队列中他是一个最后出队列的元素。...所以我们需要将它前面的元素,依次出队列在入队列,这样当前元素即成了队列的首元素(即模拟栈的栈顶元素)。
来源 lintcode-用栈实现队列 描述 正如标题所述,你需要使用两个栈来实现队列的一些操作。...首先有两个栈,主栈main和辅助栈helper. push()的时候直接向main中添加. pop()/top()的时候,将当前所有元素从main出栈,然后helper入栈.然后弹出栈顶元素....将弹出后的所有元素从helper出栈,main入栈,恢复原来的次序,方便后续继续push....main.empty()) { helper.push(main.pop()); } } //不为空或者转移之后,直接弹出helper的栈顶元素,用pop()...main.empty()) { helper.push(main.pop()); } } //不为空或者转移之后,直接获取helper的栈顶元素,用peek(
领取专属 10元无门槛券
手把手带您无忧上云