`
gogole_09
  • 浏览: 206073 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据结构与算法分析--栈的应用

阅读更多

事实上,可以利用数据结构中的 “栈”来做许多实用的操作。 下面就来列举几个,各位有用可以直接拿去用。

 

一、 利用栈来进行进制数的转换。

直接上代码说话:

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语言来学习和应用数据结构和算法的平台。通过这本书的学习,读者能够有效提升自己在算法设计和...

    数据结构与算法分析--c语言描述

    《数据结构与算法分析--C语言描述》是由Mark Allen Weiss编写的关于数据结构和算法分析的书籍。这本书是英文版本,虽然在描述中提到了对学习C语言的朋友有很大的帮助,但是具体分析的是英文版的内容。 首先,本书的...

    数据结构与算法分析-JAVA实现-带书签目录超清文字版

    数据结构与算法分析是计算机科学中的核心领域,它关乎如何高效地存储和处理数据,以及设计和实现高效的计算过程。本书“数据结构与算法分析-JAVA实现”专注于使用Java编程语言来阐述这些概念,这对于Java开发者来说...

    <<数据结构与算法分析-C语言描述>>编程练习

    《数据结构与算法分析-C语言描述》是一本深入探讨数据结构和算法的书籍,它以C语言为载体,为读者提供了丰富的编程实践。这本教材的编程练习是学习过程中的重要组成部分,旨在帮助读者巩固理论知识,提升实际编程...

    数据结构与算法分析_C++语言描述(第2版)_Larry Nyhoff

    《数据结构与算法分析_C++语言描述(第2版)》是Larry Nyhoff撰写的一本经典教材,专注于探讨数据结构和算法的理论及其在C++编程语言中的实现。这本书不仅适合初学者,也对有一定经验的程序员有很高的参考价值。在...

    数据结构与算法分析----java语言描述 (1)

    本标题《数据结构与算法分析----java语言描述 (1)》与描述《数据结构与算法分析----java语言描述 (1).pdf java基础》中隐含了若干重要的知识点,主要围绕着数据结构和算法分析这两个IT专业核心话题,并且使用Java...

    数据结构与算法分析-------

    ### 数据结构与算法分析 #### 书目简介与特点 《数据结构与算法分析》是一本专注于使用Java语言介绍数据结构和算法的经典教材。作者Robert Lafore以轻松幽默的方式介绍了如何利用数据结构解决实际问题,这使得本书...

    数据结构与算法分析---C语言描述

    《数据结构与算法分析---C语言描述》这本书详细的介绍了算法的基本原理和实现方法,书中使用伪代码的形式阐述了各种数据结构的特色和算法的运行机制。这本书是用C语言来描述算法的,因为C语言在IT行业内有着非常重要...

    数据结构与算法分析-C++描述

    ### 数据结构与算法分析-C++描述 #### 一、引言 《数据结构与算法分析-C++描述》这本书是计算机科学领域中非常重要的教材之一,它深入浅出地讲解了数据结构的基本概念以及各种算法的设计与分析方法。本书第三版在前...

    数据结构与算法分析-java语言描述(第二版)

    这些链接虽然和本知识点的主体内容没有直接关系,但它们指向的可能是可以辅助学习的外部资源,对于想要深入学习Java语言和数据结构算法的学生和从业人员来说,这些资源可能会非常有价值。 综上所述,这本书系统地...

    数据结构与算法分析-C语言描述

    数据结构与算法分析是计算机科学中的核心领域,它关乎如何高效地存储和处理信息,以及设计解决问题的方法。在这个主题中,C语言常被选为实现这些概念的编程语言,因为它的效率高、接近硬件,适合底层操作。"数据结构...

    湖南交通工程学院2022年专升本数据结构与算法分析---考试大纲专升本软件考试大纲.docx

    数据结构与算法分析是软件工程专业的核心课程,旨在培养学生对数据结构和算法的理解和应用能力。本考试大纲涵盖了数据结构和算法分析的基本概念、逻辑结构、存储结构、算法设计和分析、数据处理原理和方法等方面的...

    数据结构与算法分析-Allen Weiss--C(第二版)--Java(第三版)--C++(第四版)--大合集

    数据结构与算法分析是计算机科学中的核心领域,它关乎如何高效地存储和处理数据,以及设计和实现解决问题的计算过程。Allen Weiss所著的《数据结构与算法分析》系列书籍,以其深入浅出的讲解和丰富的实例,成为了该...

    数据结构,算法与应用 ---C++语言描述(代码与习题答案)

    数据结构、算法与应用是计算机科学中的核心领域,它们对于理解和解决复杂问题至关重要。C++是一种强大且灵活的编程语言,常被用于实现这些概念,因为它提供了底层控制和高效的执行能力。本资料集以C++语言为载体,...

    《数据结构与算法分析-C语言描述》习题答案

    《数据结构与算法分析-C语言描述》是一本深入解析数据结构和算法的权威书籍,它以其清晰的C语言实现和深刻的算法分析而受到广大程序员和计算机科学学生的喜爱。该书覆盖了众多重要的数据结构,如数组、链表、栈、...

    数据结构算法与应用-C__语言描述.rar

    《数据结构算法与应用-C语言描述》这本书籍,旨在帮助读者深入理解数据结构和算法,并通过C语言来实践这些理论。 一、数据结构 1. 线性数据结构:包括数组、链表(单链表、双链表)、队列和栈。数组是最基本的数据...

    湖南交通工程学院2022年专升本数据结构与算法分析-考试大纲专升本(软件)考试大纲.docx

    湖南交通工程学院2022年专升本数据结构与算法分析-考试大纲专升本(软件)考试大纲.docx 本考试大纲专门为湖南交通工程学院2022年专升本软件工程专业学生设计,旨在考察学生对数据结构与算法分析的理解和掌握情况。该...

    数据结构和算法分析 C++版 第三版

    数据结构和算法分析的应用非常广泛,包括数据库管理、网络协议、操作系统、人工智能、数据挖掘等领域。在这些领域中,数据结构和算法分析都是关键技术,用于提高系统的性能和效率。 学习指南 为了更好地学习数据...

Global site tag (gtag.js) - Google Analytics