Infix expressions 中缀表达式
中缀表达式的计算
利用两个栈来实现,操作数栈,操作符栈
只支持个位数运算
最后必须输入一个'#'
#include<iostream>
using namespace std; template<typename ElementType>
struct Node
{
ElementType data;
Node<ElementType>* next;
}; template<typename ElementType>
class LinkStack
{
public:
LinkStack()
{
top = new Node<ElementType>;
top = NULL;
}
~LinkStack()
{
delete top;
}
void push(ElementType item);
void pop();
ElementType front() const;
private:
Node<ElementType>*top;
}; template<typename ElementType>
void LinkStack<ElementType>::push(ElementType item)
{
Node<ElementType>*p = new Node<ElementType>;
p->data = item;
p->next = top;
top = p;
} template<typename ElementType>
void LinkStack<ElementType>::pop()
{
Node<ElementType>*p = top;
top = top->next;
delete p;
} template<typename ElementType>
ElementType LinkStack<ElementType>::front()const
{
return top->data;
} bool isNum(char c)
{
return (c <= '9' && c >= '0');
} char Precede(char f, char c)
{
if (f == '+')
{
if (c == '*' || c == '/' || c == '(')return '<';
else return '>';
}
else if (f == '-')
{
if (c == '*' || c == '/' || c == '(')return '<';
else return '>';
}
else if (f == '*')
{
if (c == '(')return '<';
else return'>';
}
else if (f == '/')
{
if (c == '(')return '<';
else return'>';
}
else if (f == '(')
{
if (c == ')')return '=';
else return '<';
}
else if (f == ')')return '>';
else if (f == '#')
{
if (c == '#')return '=';
else return '<';
}
} int Operator(int a, int b, LinkStack<char>* L)
{
if (L->front() == '+')
return a + b;
else if (L->front()== '-')
return a - b;
else if (L->front() == '*')
return a*b;
else if (L->front() == '/')
return a / b;
} void evaluate(LinkStack<char>*SOPTR, LinkStack<int>*SOPND)
{
SOPTR->push('#');
char c;
cin >> c;
while (c != '#' || SOPTR->front() != '#')
{
if (isNum(c))
{
int n = c - '0';
SOPND->push(n);
cin >> c;
}
else
{
switch (Precede(SOPTR->front(), c))
{
case '<':SOPTR->push(c);
cin>>c;
break;
case '=':SOPTR->pop();
cin >> c;
break;
case '>':
int a = SOPND->front();
SOPND->pop();
int b = SOPND->front();
SOPND->pop();
SOPND->push(Operator(a, b, SOPTR));
SOPTR->pop();
}
}
}
cout << SOPND->front() << endl;
delete SOPND, SOPTR;
} int main()
{
cout << "input the infix expression:(you must input # to stop input)" << endl;
LinkStack<char>* SOPTR = new LinkStack<char>;
LinkStack<int>* SOPND = new LinkStack<int>;
evaluate(SOPTR,SOPND); return 0;
}
Infix expressions 中缀表达式的更多相关文章
- sicily 中缀表达式转后缀表达式
题目描述 将中缀表达式(infix expression)转换为后缀表达式(postfix expression).假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含左括号'(',右括号‘)’ ...
- 【java】中缀表达式转后缀表达式 java实现
算法: 中缀表达式转后缀表达式的方法:1.遇到操作数:直接输出(添加到后缀表达式中)2.栈为空时,遇到运算符,直接入栈3.遇到左括号:将其入栈4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出 ...
- 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决
1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...
- PAT (Advanced Level) 1128~1131:1128N皇后 1129 模拟推荐系统(set<Node>优化) 1130 中缀表达式
1128 N Queens Puzzle(20 分) 题意:N皇后问题.按列依次给定N个皇后的行号,问N个皇后是否能同时不存在行冲突.列冲突和主副对角线冲突. 分析: 1.根据题意一定不存在列冲突,所 ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- RPN-逆波兰计算器-中缀表达式转后缀表达式-javascript
1.利用栈(Stack)来存储操作数和操作符: 2.包含中缀表达式转后缀表达式的函数,这个是难点,也是关键点: 2.1.将输入字符串转为数组: 2.2.对转换来的字符进行遍历:创建一个数组,用来给存储 ...
- 中缀表达式转后缀表达式(用于求字符串表达式值)(js栈和队列的实现是通过数组的push和unshift方法插值,pop方法取值)
中缀表达式:就是我通常用的算术或逻辑公式: 后缀表达式:不包含括号,运算符放在两个运算对象后面,所有的计算按运算符出现的顺序,严格从左向右进行,不用考虑运算符优先级: 如,(2+1)*3 转换后,2 ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- ACM题目————中缀表达式转后缀
题目描述 我们熟悉的表达式如a+b.a+b*(c+d)等都属于中缀表达式.中缀表达式就是(对于双目运算符来说)操作符在两个操作数中间:num1 operand num2.同理,后缀表达式就是操作符在两 ...
随机推荐
- python修炼4
---恢复内容开始--- 集合 建立 set() ={},集合没有顺序,由不可改变的数字 ,字符串,元组构成 #交集print(a&b) #a.intersection(b) #并集prin ...
- 3.Thread中的静态方法
1.currentThread() public class Thread14 extends Thread{ static { System.out.println("静态块的打印:&qu ...
- java中String类型的相关知识
String类方法整理说明: ·Length()用来求字符串的长度,返回值为字符串的长度: ·charAt()取该字符串某个位置的字符,从0开始,为char类型: ·getChars()将这个字符串中 ...
- 虚拟机Q&A
Q1:虚拟机运行一段时间后,各个版本的第一台虚拟机容量变大,增大容量可以接受 原因:不详 解决方法:用备份镜像替换当前镜像 1.1G Jun 24 17:07 win7_sp1_32_0.qcow2 ...
- linux的命令使用记录
iptables禁止53端口的出包(dns) iptables -A OUTPUT -p udp --dport 53 -j DROP linux查看网络监听端口 netstat -npl 文件复制 ...
- mysql简单建表
MySQL 字段约束 null,not null,default,auto_increment [来源于] 没有规矩,不成方圆,任何事物都是如此.在MySQL中,每个字段定义都包含附加约束或者修饰符, ...
- POJ 1845 Sumdiv#质因数分解+二分
题目链接:http://poj.org/problem?id=1845 关于质因数分解,模板见:http://www.cnblogs.com/atmacmer/p/5285810.html 二分法思想 ...
- 安卓.点击头像-->编辑个人姓名-->提交后.同时调用js关闭页面-->返回上一层
$(document).ready(function() { $('#selfbtn').click(function(){ var u = navigator.userAgent; if (u.in ...
- 6、Struts2拦截器实现权限控制
1.创建如下项目结果 2.在com.entity包下创建 package com.entity; public class User { private String name; private St ...
- bullet_01
#include <btBulletDynamicsCommon.h> #include <osgViewer/Viewer> #include <map> #in ...