`

栈(2)---栈的应用

 
阅读更多
栈的应用google、百度一大把,这里就弄一个简单的例子:中缀表达式 转 后缀表达式

中缀表达式(就是我们人类通常写的算术表达式)中,计算需要注意优先级、括号这些问题,和运算符的实际运算次序往往同它们在表达式中的先后次序不一致,所以波兰科学家提出了后缀表达式,把运算符放在两个运算对象的后面。

  在后缀表达式中看,不存在括号,也不存在运算符优先级的差别,计算过程完全按照运算符出现的先后次序进行,整个计算过程仅需扫描一遍便可完成。

中缀表达式转换成后缀表达式:

  中缀算术表达式转换成对应的后缀算术表达式的规则是:把每个运算符都移到它的两个运算对象的后面,然后删除掉所有的括号即可。

  为了转换正确,必须设定一个运算符栈,并在栈底放入一个特殊算符,假定为@,让它具有最低的运算符优先级,此栈用来保存扫描中缀表达式得到的暂不能放入后缀表达式中的运算符,待它的两个运算对象都放入到后缀表达式之后,再令其出栈并写入到后缀表达式中。

  转换过程如下:从头到尾扫描中缀表达式,若遇到数字则直接写入后缀表达式,若遇到运算符,则比较栈顶元素和该运算符的优先级,当该运算符的优先级大于栈顶元素的时候,表明该运算符的后一个运算对象还没有进入后缀表达式,应该把该运算符暂存于运算符栈中,然后把它的后一个运算对象写入到后缀表达式中,再令其出栈并写入后缀表达式中;若遇到的运算符优先级小于等于栈顶元素的优先级,表明栈顶运算符的两个运算对象已经被写入后缀表达式,应将栈顶元素出栈并写入后缀表达式,对于新的栈顶元素仍进行比较和处理,直到栈顶元素的优先级小于当前等待处理的运算符的优先级为止,然后令该运算符进栈即可。

  按照上述过程扫描到中缀表达式的末尾,把剩余的运算符依次出栈并写入后缀表达式即可。

  (对于左括号直接进栈,右括号则使左右两个括号内的运算符都出栈)。

 

看代码比较省力,如下:

package com.matt.stack;

import java.util.*;

public class Expression {

	
	String expression = "";
	

	public Expression() {

	}

	public Expression(String _expression) {
		this.expression = _expression;
	}

	public List<String> toRight() {
		if(this.expression.equals("")||this.expression == null) throw new NullPointerException();
		Stack<String> temp = new Stack<String>();
		List<String> list = new ArrayList<String>();
		char[] charArray = this.expression.toCharArray();
		for (int i = 0; i < charArray.length; i++) {
			switch (charArray[i]) {
			case '+':
				while(!temp.isEmpty()&&!temp.peek().equals("(")){
					list.add(temp.pop());
				}
			    temp.push(String.valueOf(charArray[i]));
				break;
			case '-':
				while(!temp.isEmpty()&&!temp.peek().equals("(")){
					list.add(temp.pop());	
				}
			    temp.push(String.valueOf(charArray[i]));
				break;
			case '*':
				while(!temp.isEmpty()&&(temp.peek().equals("*")||temp.peek().equals("/"))){
					list.add(temp.pop());	
				}
				temp.push(String.valueOf(charArray[i]));
				break;
			case '/':
				while(!temp.isEmpty()&&(temp.peek().equals("*")||temp.peek().equals("/"))){
					list.add(temp.pop());	
				}
				temp.push(String.valueOf(charArray[i]));
				break;
			case '(':
				temp.push(String.valueOf(charArray[i]));
				break;
			case ')':
				do{
					list.add(temp.pop());
				}while(!temp.peek().equals("("));
				temp.pop();
				break;
				
			default:
				list.add(String.valueOf(charArray[i]));
				break;

			}
		}
		while(!temp.isEmpty())
			list.add(temp.pop());
		return list;
	}

	public List<String> toRight(String _expression) {
		this.expression = _expression;
		return toRight();
	}

	private String listtoString(List<String> lst){
		String toStr = "";
		for(String str : lst){
			toStr += str;
		}
		return toStr;
	}
	
	
	public static void main(String[] args) {
		Expression ex = new Expression("a+b*c-(d*e+f)/g");
		
		List<String> lst = ex.toRight();
		System.out.println(ex.listtoString(lst));
		
		lst = ex.toRight("1+2-5*(5-4)*6-(6-1)");
		System.out.println(ex.listtoString(lst));
		
		lst = ex.toRight("1*2/(2+1)*7");
		System.out.println(ex.listtoString(lst));
		
	}

}

 

分享到:
评论

相关推荐

    栈的应用----算术表达式求值程序

    栈的应用广泛,其中之一就是用于解决算术表达式的求值问题。本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+...

    栈的应用-c++

    在提供的压缩包文件`shiyan_3栈的应用`中,可能包含了实现这个功能的源代码,通过阅读和学习这些代码,你可以深入理解栈在实际问题中的应用,以及C++中如何使用栈数据结构来解决实际问题。这样的练习对于提升C++编程...

    栈操作----

    在计算机科学中,栈被广泛应用在编译器、内存管理、算法实现等多个领域。在这个主题中,我们将深入探讨栈的基本操作以及C++中实现栈的模板。 1. **栈的基本操作**: - **压栈(Push)**: 当向栈中添加一个元素时,...

    栈的应用-中缀-后缀_particularlyu77_栈的应用-中缀-后缀_

    本主题“栈的应用-中缀-后缀”着重讲解如何利用栈来处理中缀表达式和后缀表达式的转换,这对于理解和实现计算算法至关重要。中缀表达式是我们日常生活中常见的数学公式形式,例如 \(2 + 3 * 4\),而后缀表达式,又称...

    栈的应用--数值转换

    在“栈的应用--数值转换”这个主题中,我们将深入探讨如何使用C++和C语言通过栈来实现数值的转换。在这个过程中,我们可以看到数据结构与算法的巧妙结合,特别是严蔚敏教授的经典数据结构教程中的相关概念。 栈通常...

    栈的应用----数制转换(C/C++)

    【栈的应用——数制转换(C/C++)】 在计算机科学中,数制转换是一种常见的操作,用于在不同数值系统之间转换数字。本程序利用栈(Stack)这一数据结构来实现数制转换,主要涉及十进制到其他进制(如八进制、十六...

    C语言数据结构栈应用-进制转换

    该源码 详细说明了c语言中 顺序栈在进制转换上的应用

    zigbee CC2530 协议栈zstack-cc2530-2.5.1包含完整可用的库文件

    Zigbee CC2530协议栈ZStack-CC2530-2.5.1是基于TI公司的CC2530微控制器的Zigbee通信协议实现,这是一个广泛应用于无线传感器网络(WSN)和物联网(IoT)领域的低功耗、短距离无线通信技术。ZStack是一个完整的软件...

    73334魔方栈源码-网站在线玩魔方源码-云魔方.rar

    《73334魔方栈源码-网站在线玩魔方源码-云魔方》是一款基于网页的4阶魔方模拟应用,允许用户在网站上体验魔方的旋转和解谜乐趣。该源码提供了丰富的自定义选项,如魔方阶数的调整、界面配色以及操作快捷键等,旨在为...

    数据结构--栈--实现算法

    栈在许多计算问题中都有应用,例如表达式求值、函数调用、深度优先搜索等。在C++这样的编程语言中,虽然标准库提供了`&lt;stack&gt;`容器来直接使用栈,但理解栈的基本原理和自定义实现有助于我们更好地掌握其工作方式。 ...

    实验二 栈的应用---算术表达式的计算.doc

    实验二 栈的应用---算术表达式的计算.doc

    算法大全-面试题-链表-栈-二叉树-数据结构

    "算法大全-面试题-链表-栈-二叉树-数据结构"这个压缩包文件提供了丰富的知识资源,旨在帮助学习者深入理解和应用这些核心概念。 链表是一种线性数据结构,与数组不同,它的元素在内存中不是连续存储的。链表由一...

    ZStack协议栈 ZStack-CC2530-2.5.1a

    2. 集成开发环境(IDE):ZStack通常与IAR Embedded Workbench或CCS (Code Composer Studio)等IDE配合使用,以便编写、编译和调试应用程序代码。开发者需要确保这些IDE已安装并且兼容ZStack的版本。 3. 配置:根据...

    揭开ZigBee 2006协议栈Z-Stack的”开源“面纱.pdf

    ZigBee 2006协议栈Z-Stack是业界广泛应用的无线通信技术,尤其在物联网(IoT)领域。然而,当我们谈论Z-Stack的开源性质时,需要对其开放程度有清晰的理解。Z-Stack由德州仪器(TI)在2007年推出,它遵循ZigBee 2006规范...

    揭开ZigBee 2006协议栈Z-Stack的”开源“面纱 (2).pdf

    ZigBee 2006协议栈Z-Stack是业界广泛应用的无线通信技术,尤其是在物联网(IoT)领域。它是一个符合ZigBee 2006规范的全功能协议栈,由德州仪器(TI)于2007年4月推出。Z-Stack并非单一的开源项目,而是一种基于ZigBee...

    揭开ZigBee 2006协议栈Z-Stack的”开源“面纱 (2).docx

    例如,TI的CC2480芯片已将协议栈集成到硬件中,开发者只需使用简单的API就能完成基本应用开发。 除了Z-Stack,还有其他真正开源的ZigBee协议栈,如msstatePAN、freakz等。这些协议栈提供了全部源代码,让开发者能够...

    数据结构之栈--迷宫求解

    在本话题中,我们将深入探讨数据结构之一——栈,并以其在解决“走迷宫”问题中的应用为例进行讲解。 栈是一种特殊的线性数据结构,遵循“后进先出”(LIFO)原则,类似于日常生活中的叠盘子。栈的主要操作有压入...

    TI最新协议栈ZStack-CC2530-2.5.1a

    TI官方协议栈源代码,是学习的好资料!...在通信的接收方数据包依次向上通过协议栈,每一层的实体能够根据预定的格式准确的提取需要在本层处理的数据信息,最终用户应用程序得到最终的数据信息进行处理。

Global site tag (gtag.js) - Google Analytics