《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果
/**
* 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤-->
* 若项不为(,则写至输出; 若项为(,则推出循环 operator(opThis): 若栈为空,推opThis; 否则,重复-->
* 弹出一项,若项为(,推其入栈; 若项为operator,且 若opTop<opThis,推入opTop,或 若opTop>=opThis,输出opTop,
* 若opTop<opThis则退出循环,或项为( 推入opThis 没有更多项: 当栈非空时,弹出项目,将其输出
*
*/
class StackI {
private int maxSize;
private char[] stack;
private int top; public StackI(int size) {
maxSize = size;
stack = new char[size];
top = -1;
} public void push(char value) {
stack[++top] = value;
} public char pop() {
return stack[top--];
} public char peek() {
return stack[top];
} public char peekN(int index) {
return stack[index];
} public int size() {
return top + 1;
} public boolean isFull() {
return top == maxSize;
} public boolean isEmpty() {
return top == -1;
} @Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size(); i++) {
sb.append(peekN(i) + ",");
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
return sb.toString();
} public void display() {
System.out.print("当前栈: " + toString());
}
} class InToPost {
private String input, output;
private StackI stack; public InToPost(String in) {
input = in;
output = "";
int stackSize = input.length();
stack = new StackI(stackSize);
} public void gotOper(char opThis, int prec1) {
while (!stack.isEmpty()) {
char opTop = stack.pop();
if (opTop == '(') {
stack.push(opTop);
break;
} else {
int prec2;
if (opTop == '+' || opTop == '-')
prec2 = 1;
else
prec2 = 2;
if(prec2<prec1){
stack.push(opTop);
break;
}else{
output += opTop;
}
}
}
stack.push(opThis);
} public void gotParen(char ch){
while(!stack.isEmpty()){
char chx = stack.pop();
if(chx == '(')
break;
else
output += chx;
}
} public String doTrans() {
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);
switch (ch) {
case '+':
case '-':
gotOper(ch, 1);
break;
case '*':
case '/':
gotOper(ch, 2);
break;
case '(':
stack.push(ch);
break;
case ')':
gotParen(ch);
break;
default:
output += ch;
break;
}
}
while(!stack.isEmpty()){
output += stack.pop();
}
return output;
}
/**
* 计算后缀表达式结果
* 遇到操作数--入栈
* 遇到操作符--从栈中提取两个操作数,用操作符执行运算,结果入栈
* 注:这里转换后缀和计算后缀表达式共用了一个栈类型Model,所以在计算过程中字符和int转换时多了一些操作
* @param in
* @return
*/
public int doParse(String in){
stack = new StackI(20);
int num1,num2,result = 0;
int j;
char c;
for(j=0;j<in.length();j++){
c = in.charAt(j);
if(c>='0' && c<='9'){
stack.push(c);
}else{
num2 = (int)(stack.pop()-'0');
num1 = (int)(stack.pop()-'0');
switch (c) {
case '+':
result = num1+num2;
break;
case '-':
result = num1-num2;
break;
case '*':
result = num1*num2;
break;
case '/':
result = num1/num2;
break;
default:
result = 0;
break;
}
stack.push((char)(result+'0'));
}
}
result = (int)(stack.pop()-'0');
return result;
}
} public class InfixDemo {
/**
* 读取字符串
*
* @return
* @throws IOException
*/
public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(isr);
return reader.readLine();
}
public static void main(String[] args) throws IOException {
String input, output;
while(true){
System.out.println("enter:");
System.out.flush();
input = getString();
if(input.equals(""))
break;
InToPost i = new InToPost(input);
output = i.doTrans();
System.out.println(output);
System.out.println(i.doParse(output));
}
}
}
《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果的更多相关文章
- Java数据结构和算法(一)线性结构之单链表
Java数据结构和算法(一)线性结构之单链表 prev current next -------------- -------------- -------------- | value | next ...
- Java数据结构和算法(一)线性结构
Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...
- 栈应用之 后缀表达式计算 (python 版)
栈应用之 后缀表达式计算 (python 版) 后缀表达式特别适合计算机处理 1. 中缀表达式.前缀表达式.后缀表达式区别 中缀表达式:(3 - 5) * (6 + 17 * 4) / 3 17 ...
- Java数据结构和算法(四)——栈
前面我们讲解了数组,数组更多的是用来进行数据的存储,纯粹用来存储数据的数据结构,我们期望的是插入.删除和查找性能都比较好.对于无序数组,插入快,但是删除和查找都很慢,为了解决这些问题,后面我们会讲解比 ...
- Java数据结构和算法(一)--栈
栈: 英文名stack,特点是只允许访问最后插入的那个元素,也就是LIFO(后进先出) jdk中的stack源码: public class Stack<E> extends Vector ...
- javascript使用栈结构将中缀表达式转换为后缀表达式并计算值
1.概念 你可能听说过表达式,a+b,a+b*c这些,但是前缀表达式,前缀记法,中缀表达式,波兰式,后缀表达式,后缀记法,逆波兰式这些都是也是表达式. a+b,a+b*c这些看上去比较正常的是中缀表达 ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
随机推荐
- BZOJ 3170 松鼠聚会(XY坐标)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3170 题意:给出二维平面上n个点 (xi,yi).求一点t(1<=t<=n) ...
- [CFGym101028] 2016 Al-Baath University Training Camp Contest-1
比赛链接:http://codeforces.com/gym/101028/ 由于实习,几乎没有时间刷题了.今天下午得空,断断续续做了这一套题,挺简单的. A.读完题就能出结果. /* ━━━━━┒ギ ...
- hdu4003Find Metal Mineral(树形DP)
4003 思维啊 dp[i][j]表示当前I节点停留了j个机器人 那么它与父亲的关系就有了 那条边就走了j遍 dp[i][j] = min(dp[i][j],dp[child][g]+dp[i][j- ...
- svn:revert to this version 和 revert changes from this version的区别
假设我们有许多个版本,版本号分别是1-10 如果我们在7这里选择revert to this version那么7之后的8,9,10的操作都会被消除 如果在7选择revert changes from ...
- HDU 3951 (博弈) Coin Game
先考虑两种简单的情况: 如果先手能一次把硬币拿完,即 k >= n ,那么先手胜 如果每次只能拿一个硬币, 即 k = 1 ,那么如果有奇数个硬币先手胜,如果有偶数个硬币后手胜. 剩下的情况就是 ...
- decorate装饰模式
package com.decorate; public class Iphone implements Phone{ @Override public void call() { System.ou ...
- 【C#学习笔记】函数调用
using System; namespace ConsoleApplication { class Program { static int Add(int a, int b) { return a ...
- EIG集团简单介绍
有朋友会问为什么要介绍EIG集团,他们是干什么的?与域名.主机.IDC行业资讯等有啥关系?EIG集团很牛逼么?带着这些疑问,简单的给大家做个介绍,希望能帮助大家了解这个IDC行业里面的“魔鬼”! EI ...
- 查看事务锁:innodb_trx+innodb_locks+innodb_lock_waits
当出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,要解决是一件麻烦的事情:特别是当一个SQL ...
- http tcp联系区别
术语TCP/IP代表传输控制协议/网际协议,指的是一系列协议.“IP”代表网际协议,TCP和UDP使用该协议从一个网络传送数据包到另一个网络.把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到 ...