事实上,可以利用数据结构中的 “栈”来做许多实用的操作。 下面就来列举几个,各位有用可以直接拿去用。
一、 利用栈来进行进制数的转换。
直接上代码说话:
package com.base.stack;
import java.util.Stack;
/**
* 使用栈来转换数字
* 10进制转换为2进制
* @author gogole_09
*
*/
public class Demo1 {
public static void main(String[] args) {
System.out.println(toBinary(1123));
}
public static String toBinary(int num){
String result="";
Stack s=new Stack();
while(num!=0){
s.push(num%2);//取摸,将余数压入栈
num=num/2; //消去十进制数的最后一位
}
while(!s.isEmpty()){
result+=s.pop();//出栈
}
return result;
}
}
二、做后缀表达式运算(何为后缀表达式--代码中说明):
package com.base.stack;
import java.util.Stack;
/**
* 用作后缀表达式求解
*
* @author gogole_09
*
* 何为后缀表达式:
*
* 举例如下: 假设我们需要一个便携式计算器来计算一趟外出购物的花费(包括当地的税款,假设为1.06) 买了3个货品 A:4.99 B:5.99 C:6.99
* 设B不需要缴税,具体计算如下: 4.99*1.06+5.99+6.99*1.06= 问题出在这里。
* 简单计算器会给你19.37,而科学计算器会给你18.69. 显然,我们需要的结果是18.69,实际科学计算器计算时,一般会自动包含括号,
* 所以当我们处理这类问题时,我们的思路如下:
1) 4.99*1.06 存入 A1
2) 5.99 + A1 -->结果存入A1
3) 6.99*1.06 存入 A2
4) A1+A2 -->结果存入A1
*
* 故后缀表达式如下: 【4.99 1.06 * 5.99 + 6.99 1.06 * + 】
*/
public class PostfixDemo {
/**(以整数为例)
* 以后缀表达式: 6 5 3 2 + 8 * + 3 + * 为例
*
* @param args
* @throws Exception
*/
public static void main(String[] args) {
PostTest();
}
public static void PostTest() {
//"34 24 23 2 4 2 + 8 * + 3 +*";
String postFix ="6 5 3 2 + 8 * + 3 + *";
Stack result = new Stack();//栈对象
int res=0;
//分组是为了能够处理多位数字 ,
//如果是"6532+8*+3+*",则无法判断到底是6,5,3,2还是6532
String[] str=postFix.split(" ");
for (int i = 0; i < str.length; i++) {
//是否为运算符
if("+-*/".indexOf(str[i])==-1)
result.push(str[i]);
else{
//栈为空,则无法后续操作
if(!result.isEmpty()){
//将两个操作数出栈
int num1=Integer.parseInt(result.pop().toString());
int num2=Integer.parseInt(result.pop().toString());
//获取运算值
res=operation(num1, num2,str[i].charAt(0));
if(res!=-1){
result.push(res);
}
}
}
}
System.out.println(result.pop());
}
/**
* 具体运算方法
* @param num1
* @param num2
* @param flag
* @return
*/
public static int operation(int num1, int num2,char flag) {
int result=0;
switch (flag) {
case '+':
result=num1+num2;
break;
case '-':
result=num1-num2;
break;
case '*':
result=num1*num2;
break;
case '/':
result=num1/num2;
break;
default:
result=-1;
break;
}
return result;
}
}
三、将中缀转换成后缀表达式。
package com.base.stack;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
/**
*
* @author gogole_09
* 转换过程包括用下面的算法读入中缀表达式的操作数、操作符和括号:
* 初始化一个空堆栈,将结果字符串变量置空。
* 从左到右读入中缀表达式,每次一个字符。
* 如果字符是操作数,将它添加到结果字符串。
* 如果字符是个操作符,弹出(pop)操作符,直至遇见开括号(opening parenthesis)、优先级较低的操作符或者同一优先级的右结合符号。把这个操作符压入(push)堆栈。
* 如果字符是个开括号,把它压入堆栈。
* 如果字符是个闭括号(closing parenthesis),在遇见开括号前,弹出所有操作符,然后把它们添加到结果字符串。
* 如果到达输入字符串的末尾,弹出所有操作符并添加到结果字符串。
*/
public class FontToBackPostFix {
public static void main(String[] args) {
FontToBackPostFix fix=new FontToBackPostFix();
List<String> list=fix.fontPostExp("2+3+(3+2)+3*4#");
for(String s:list){
System.out.println(s);
}
}
public List<String> fontPostExp(String str){//将中缀表达式转化成为后缀表达式
List<String> postfix=new ArrayList<String>();//存放着转化后后缀表达式的链表
StringBuffer numberBuf=new StringBuffer();//用来保存数字
Stack<Character> opStack=new Stack<Character>();//保存操作符
char ch,preChar;
//压入标识符
opStack.push('#');
try {
for (int i = 0; i < str.length(); ) {
ch=str.charAt(i);
switch (ch) {
case '+':
case '-':
case '*':
case '/':
preChar=opStack.peek();//查看栈顶对象而不移除它
//如果栈里面的操作符优先级比当前的大,则把栈中优先级大的都添加到后缀表达式列表中
while(priority(preChar)>=priority(ch)){
postfix.add(""+preChar);
opStack.pop();//出栈
preChar=opStack.peek();
}
opStack.push(ch);
i++;
break;
case '(':
//左括号直接压栈
opStack.push(ch);
i++;
break;
case ')':
char c = opStack.pop();
while(c != '('){
postfix.add("" + c);
c = opStack.pop();
}
i++;
break;
case '#':
char c1;
while(!opStack.isEmpty()){
c1=opStack.pop();
if(c1!='#'){
postfix.add(""+c1);
}
}
i++;
break;
case ' ':
case '\t':
i++;
break;
default:
//不是操作符,如果是数字
if(Character.isDigit(ch)){
while(Character.isDigit(ch)){
numberBuf.append(ch);
ch=str.charAt(i++);
}
postfix.add(numberBuf.toString());
numberBuf=new StringBuffer();
}else{
}
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return postfix;
}
/**
* 设置优先级
*/
public int priority(char op){
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
case '#':
return 0;
}
return -1;
}
}
关于中缀转后缀有参考
http://fuliang.iteye.com/blog/172233
处。
分享到:
相关推荐
本资源"数据结构与算法分析--C语言描述"是针对数据结构初学者的一个优秀教材,旨在帮助读者快速掌握这一领域。 首先,数据结构是组织和存储数据的方式,它决定了数据的访问效率和处理速度。常见的数据结构包括数组...
数据结构、算法与应用是计算机科学中的核心领域,它们对于理解和解决复杂问题至关重要。C++是一种强大且灵活的编程语言,常被用于实现这些概念,因为它提供了底层控制和高效的执行能力。本资料集以C++语言为载体,...
数据结构与算法分析是软件工程专业的核心课程,旨在培养学生对数据结构和算法的理解和应用能力。本考试大纲涵盖了数据结构和算法分析的基本概念、逻辑结构、存储结构、算法设计和分析、数据处理原理和方法等方面的...
《数据结构算法与应用-C语言描述》这本书籍,旨在帮助读者深入理解数据结构和算法,并通过C语言来实践这些理论。 一、数据结构 1. 线性数据结构:包括数组、链表(单链表、双链表)、队列和栈。数组是最基本的数据...
湖南交通工程学院2022年专升本数据结构与算法分析-考试大纲专升本(软件)考试大纲.docx 本考试大纲专门为湖南交通工程学院2022年专升本软件工程专业学生设计,旨在考察学生对数据结构与算法分析的理解和掌握情况。该...
数据结构和算法分析的应用非常广泛,包括数据库管理、网络协议、操作系统、人工智能、数据挖掘等领域。在这些领域中,数据结构和算法分析都是关键技术,用于提高系统的性能和效率。 学习指南 为了更好地学习数据...
学习“数据结构与算法--Java语言描述”,不仅能够理解各种数据结构的内部工作原理,还能学会如何用Java来实现它们,这对于软件开发、系统分析和算法竞赛等领域都有极大的帮助。通过深入学习和实践,我们不仅可以提升...
根据提供的文件信息,这里主要关注的是“C++数据结构与算法(第4版)”这一主题,虽然实际内容并未给出具体章节或知识点,但我们可以基于标题、描述以及部分已知内容来推测书中可能涵盖的关键知识点。 ### C++数据...
在计算机科学中,数据结构是组织、存储和处理数据的方式,它是算法设计的基础。栈是一种特殊的数据结构,遵循“后进先出”(LIFO)原则,即最后存入的元素最先被取出。本课程设计的重点是探讨栈在解决实际问题,特别...
本书不仅介绍了数据结构与算法的基本概念,还着重强调了面向对象编程范式(Object-Oriented Programming, OOP)在实际中的应用,特别是其在C++语言中的实现。 从给出的内容来看,本书至少包含了如下几个重要的知识...
### 数据结构与算法分析C++描述习题答案 #### 一、引言 《数据结构与算法分析C++描述习题答案》这本书是基于Mark Allen Weiss教授的经典教材《数据结构与算法分析》编写的答案手册。Weiss教授的原著被誉为20世纪最...
本资源“算法-数据结构和算法-4-栈和队列.rar”聚焦于两种基本但极其实用的数据结构——栈和队列,这两种结构在编程中有着广泛的应用。 栈(Stack)是一种线性数据结构,遵循“后进先出”(Last In First Out,简称...
《数据结构、算法与应用 C++语言描述》第二版是一本深入探讨数据结构、算法及其在C++编程中的实现的经典著作。这本书旨在帮助读者理解和掌握数据结构和算法的基础知识,并通过C++语言来实践这些概念,提升编程能力。...
本资料“数据结构算法与应用--C++语言描述(源代码)”涵盖了这一主题的关键概念和实现,通过C++源代码的形式进行阐述。 1. **线性数据结构**:包括数组、链表、栈和队列。数组是最基础的数据结构,提供随机访问;...
数据结构与算法分析是计算机科学中的核心课程,它主要研究如何高效地组织和管理数据,以便于进行快速的检索、插入、删除等操作。C语言因其底层特性,常被用于实现这些复杂的数据结构和算法,使得理解更加直观,性能...
文档内容涉及了数据结构与算法的基础知识,包括数学预备知识、算法分析、列表、栈和队列、二叉树、一般树、内部排序、搜索、索引、图、列表和数组的再讨论、高级树结构、文件处理和外部排序,以及分析技术和计算的...
数据结构与算法是计算机科学的基础,对于任何编程学习者来说,理解和掌握它们至关重要。这个“数据结构与算法-----PPT版本”很可能包含了徐旭松教授或专家精心制作的一系列教学材料,旨在帮助学习者深入理解这些核心...