java学习之—使用栈实现字符串数字四则运算
/**
* 使用栈存储后缀表达式
* Create by Administrator
* 2018/6/13 0013
* 下午 2:25
**/
public class StackX { private int maxSize;
private char[] stackArray;
private int top; public StackX(int size) // 构造函数
{
maxSize = size;
stackArray = new char[maxSize];
top = -1;
} public void push(char j) // 将项目放在堆栈的顶部
{
stackArray[++top] = j;
} public char pop() // 从堆栈顶部取项
{
return stackArray[top--];
} public char peek() // 从堆栈顶部查看
{
return stackArray[top];
} public boolean isEmpty() // 如果栈为空,则为true
{
return (top == -1);
} public boolean isFull() // 如果堆栈已满 true
{
return (top == maxSize - 1);
} public int size() // return size
{
return top + 1;
} public char peekN(int n) // peek at index n
{
return stackArray[n];
} public void displayStack(String s) {
System.out.print(s);
System.out.print("Stack (bottom-->top): ");
for (int j = 0; j < size(); j++) {
System.out.print(peekN(j));
System.out.print(' ');
}
System.out.println("");
} }
/**
* 使用栈存储计算过程结果
* Create by Administrator
* 2018/6/14 0014
* 上午 10:37
**/
public class StackR {
private int maxSize;
private int[] stackArray;
private int top; public StackR(int size) // 构造函数
{
maxSize = size;
stackArray = new int[maxSize];
top = -1;
} public void push(int j) // 将项目放在堆栈的顶部
{
stackArray[++top] = j;
} public int pop() // 从堆栈顶部取项
{
return stackArray[top--];
} public int peek() // 从堆栈顶部查看
{
return stackArray[top];
} public boolean isEmpty() // 如果栈为空,则为true
{
return (top == -1);
} public boolean isFull() // 如果堆栈已满 true
{
return (top == maxSize - 1);
} public int size() // return size
{
return top + 1;
} public int peekN(int n) // peek at index n
{
return stackArray[n];
} public void displayStack(String s) {
System.out.print(s);
System.out.print("Stack (bottom-->top): ");
for (int j = 0; j < size(); j++) {
System.out.print(peekN(j));
System.out.print(' ');
}
System.out.println("");
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; /**
* Create by Administrator
* 2018/6/13 0013
* 下午 2:38
**/
public class InTOPost { private StackX stackX;
private StackR stackR;
private String input;
private String outPut = ""; public InTOPost(String in) {
this.input = in;
int stackSize = input.length();
stackX = new StackX(stackSize); } /**
* 中缀表达式转后缀表达式
* @return
*/
public String doTrans() {
for (int i = 0; i < input.length(); i++) {
char ch = input.charAt(i);//拿到每个字符
stackX.displayStack("For " + ch + " ");
switch (ch) {
case '+':
case '-':
getOpera(ch, 1);
break;
case '*':
case '/':
getOpera(ch, 2);
break;
case ')':
getParen(ch);
break;
case '(':
stackX.push(ch);
break;
default:
outPut = outPut + ch; //是数字将其写入输出
break;
}
}
while (!stackX.isEmpty()) {
stackX.displayStack("While ");
outPut = outPut + stackX.pop();
}
stackX.displayStack("End ");
return outPut;
} private void getOpera(char opThis, int prec1) {
while (!stackX.isEmpty()) {
char opTop = stackX.pop();
if (opTop == '(') {
stackX.push(opTop);
break;
} else {
int prec2;
if (opTop == '+' || opTop == '-') {
prec2 = 1;
} else {
prec2 = 2;
}
if (prec2 < prec1) {
stackX.push(opTop);
break;
} else {
outPut = outPut + opTop;
}
}
}
stackX.push(opThis);
} private void getParen(char ch) {
while (!stackX.isEmpty()) {
char chx = stackX.pop();
if (chx == '(') {
break;
} else {
outPut = outPut + chx;
}
}
} /**
* 计算后缀表达式的结果
* @param output
* @return
*/
public int doParse(String output) {
stackR = new StackR(20); //新建堆栈
char ch;
int num1, num2, interAns;
for (int i = 0; i < output.length(); i++) { //遍历后缀表达式的字符串
ch = output.charAt(i); // 读取到每一个字符
stackR.displayStack(ch + " ");
if (ch >= '0' && ch <= '9') { // 判断是不是数字
stackR.push((int) (ch - '0')); // 放入到栈里
} else {
num2 = stackR.pop(); // 如果不是数字,就从栈里取出两个数字
num1 = stackR.pop();
switch (ch) { // 判断是哪个运算符,并计算
case '+':
interAns = num1 + num2;
break;
case '-':
interAns = num1 - num2;
break;
case '*':
interAns = num1 * num2;
break;
case '/':
interAns = num1 / num2;
break;
default:
interAns = 0;
}
stackR.push(interAns); // 把计算结果放入栈里
}
}
interAns = stackR.pop(); // 获得最终结果
return interAns;
} /**
* 获取用户输入
* @return
* @throws IOException
*/
public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
} public static void main(String[] args) throws IOException {
String input, output;
while (true) {
System.out.print("Enter infix: ");
System.out.flush();
input = getString();
if (input.equals("")) {
break;
}
InTOPost toPost = new InTOPost(input);
output = toPost.doTrans();
System.out.println("Postfix is " + output + "\n");
int result = toPost.doParse(output);
System.out.println("结果:" + result);
}
}
运行测试:
请输入: (4+2*3)/2
For ( Stack (bottom-->top):
For 4 Stack (bottom-->top): (
For + Stack (bottom-->top): (
For 2 Stack (bottom-->top): ( +
For * Stack (bottom-->top): ( +
For 3 Stack (bottom-->top): ( + *
For ) Stack (bottom-->top): ( + *
For / Stack (bottom-->top):
For 2 Stack (bottom-->top): /
While Stack (bottom-->top): /
End Stack (bottom-->top):
Postfix is 423*+2/
4 Stack (bottom-->top):
2 Stack (bottom-->top): 4
3 Stack (bottom-->top): 4 2
* Stack (bottom-->top): 4 2 3
+ Stack (bottom-->top): 4 6
2 Stack (bottom-->top): 10
/ Stack (bottom-->top): 10 2
结果:5
java学习之—使用栈实现字符串数字四则运算的更多相关文章
- Java学习总结:飘逸的字符串
Java学习:飘逸的字符串 前言 相信不管我们运用Java语言来开发项目还是进行数据分析处理,都要运用到和字符串相关的处理方法.这个社会处处有着和字符串相关的影子:日志.文档.书籍等.既然我们离不开字 ...
- Java学习2_一些基础2_字符串_16.5.5
接上一次的博客. 不可变字符串: Java中String类没有提供用于修改字符串的方法.如果想将greeting中的“Hello”改为“Help!”需要先提取所需要的的字符,然后再拼接.即 greet ...
- java学习笔记(三)字符串
字符串String 创建方法: 一·通过new创建 String str1= new String("abc"); 二 直接创建 String str2="abc ...
- Java学习日记-3 Character和字符串
(先说几个小问题 1.在main方法中调用主类的其他方法时,必须先生成主类的对象 2.String s = new String("Hello") 生成了两个对象 3.熟用布尔+f ...
- Java学习笔记【五、字符串】
String类 11种构造,不一一列举 常用方法 s.length() 返回字符串长度 s1.contact(s2) 连接s1.s2 String.format("aaa %f bbb %d ...
- Java学习笔记【一、环境搭建】
今天把java的学习重新拾起来,一方面是因为公司的项目需要用到大数据方面的东西,需要用java做语言 另一方面是原先使用的C#公司也在慢慢替换为java,为了以后路宽一些吧,技多不压身 此次的学习目标 ...
- 【原】Java学习笔记022 - 字符串
package cn.temptation; public class Sample01 { public static void main(String[] args) { // 字符串 // 定义 ...
- Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录)
Java 打印金字塔 or 打印带数字的金字塔 (Java 学习中的小记录) 作者:王可利(Star·星星) 效果图: 代码如下: class Star8 { public static void m ...
- 《Java数据结构与算法》笔记-CH4-2用栈实现字符串反转
import java.io.BufferedReader; import java.io.InputStreamReader; //用栈来实现一个字符串逆序算法 /** * 数据结构:栈 */ cl ...
随机推荐
- TensorFlow 学习资料
感谢几位大神的笔记: https://blog.csdn.net/column/details/13300.html?&page=3 https://blog.csdn.net/u014595 ...
- 一步一步写出java swing登录界面,以及输入的参数获取
经过好几天的学习,研究,接下来说说java swing,以及内嵌浏览器的方法. 一.swing是一个用于java应用程序用户界面的的开发工具包. 例如:接下来我们做个登录界面,简要说明 做之前的构想图 ...
- mongo中游标
1.手动循环访问游标 mongo中我们常用的查询方式db.collection.find()方法其实返回的就是游标,只不过我们并未给返回的游标分配变量,我们所看到的的查询数据也就是游标自动迭代得出的( ...
- GitHub Or Subversion
上一次转载了介绍GitHub的博文点我,我想对于初学GitHub的同学们还是有不清楚的地方,毕竟有些概念的理解比较费力.我觉得作为一个对于配置库技术已经有一定基础的同学们,要学习GitHub,最快以及 ...
- kmeans聚类理论篇
前言 kmeans是最简单的聚类算法之一,但是运用十分广泛.最近在工作中也经常遇到这个算法.kmeans一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点. 本文记录 ...
- 在Winform开发中使用FastReport创建报表
FastReport.Net是一款适用于Windows Forms, ASP.NET和MVC框架的功能齐全的报表分析解决方案.可用在Microsoft Visual Studio 2005到2015, ...
- Java 多线程(六)之Java内存模型
目录 1. 并发编程的两个问题 2 CPU 缓存模型 2.1 CPU 和 主存 2.2 CPU Cache 2.3 CPU如何通过 Cache 与 主内存交互 2.4 CPU 缓存一致性问题 3 Ja ...
- Linux或Windows上实现端口映射
通常服务器会有许多块网卡,因此也可能会连接到不同的网络,在隔离的网络中,某些服务可能会需要进行通信,此时服务器经过配置就可以承担起了转发数据包的功能. 一.Windows下实现端口映射 1. 查询端口 ...
- COMCMS 微进阶篇,从0开始部署到Centos 7.4
言:上一篇,我们介绍了,如何本地调试和部署到windows服务器. 本篇,将带大家,从0到1,开始部署到Centos系统上... 经过测试,可以完美支持Centos.这也是.net core 跨平台的 ...
- python之间的基础
编程第一步 print('hello,world!') 变量名的命名的规则: 1:变量由字母,数字,下划线组成 2:变量不能以数字开头 3:禁止使用python中的关键字,如 'alse', 'Non ...