`
wangtao576
  • 浏览: 14508 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于linkedList实现栈,用栈实现表达式运算

    博客分类:
  • java
阅读更多
[size=medium] 通过上午的努力,终于在UBUNTU上装上了ECLIPSE,然后开始自己UBUNTU下的JAVA之旅。基于linkedList实现栈,用栈实现了一个简单的表达试运算。
    JAVA基于JVM所以在UBUNTU下开发和在WINDOWS下没有什么区别。自己也是为了感觉下不同操作系统下开发的感觉。进入正题:
    先贴上代码:
这一部分是基于LinkedList实现栈的部分

package Expression;

import java.util.LinkedList;

public class Stack<T>
{
	private LinkedList<T> storage=new LinkedList<T>();
	public void push(T v){storage.addFirst(v);}
	public T pop(){return storage.removeFirst();}
	public T peek(){return storage.getFirst();}
	public boolean empty(){return storage.isEmpty();}
	public String toString(){return storage.toString();}
}


这一部分代码是基于栈来实现表达式运算,代码如下:
package Expression;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class EvaluatePart
{
	static char priority[][]={//运算符的优先权判定表
		{'>','>','<','<','<','>','>'},
		{'>','>','<','<','<','>','>'},
		{'>','>','>','>','<','>','>'},
		{'>','>','>','>','<','>','>'},
		{'<','<','<','<','<','=',' '},
		{'>','>','>','>',' ','>','>'},
		{'<','<','<','<','<',' ','='},
};
	static List<Character> opc=new ArrayList<Character>();
	public EvaluatePart(){
		opc.add('+');
		opc.add('-');
		opc.add('*');
		opc.add('/');
		opc.add('(');
		opc.add(')');
		opc.add('#');
	}
	public char Precede(Character a,char b){//运算符优先权判定函数
		return priority[opc.indexOf(a)][opc.indexOf(b)];
	}
	public double Operate(double a,char op,double b){//运算部分
		switch(op){
			case '+':
					a+=b;
					break;
			case '-':
					a-=b;
					break;
			case '*':
					a*=b;
					break;
			case '/':
					a/=b;
					break;
		}
		return a;
	}
	public static void main(String[] args) 
	{
		EvaluatePart eva=new EvaluatePart();
		Stack<Character> optr=new Stack<Character>();//运算符栈
		Stack<Double> opnd=new Stack<Double>();//操作数栈
		optr.push('#');
		
		int i=0;
		System.out.print("Please enter a Expression and end with '#':");
		Scanner scanner=new Scanner(System.in);//标准输入
		String tempc=scanner.next();
		char tc[]=tempc.toCharArray();
		char c=tc[i];	
		while(c!='#'||optr.peek()!='#'){
			if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
				switch(eva.Precede(optr.peek(),c)){
				case '<'://栈顶元素优先权低
						optr.push(c);
						c=tc[++i];
						break;
				case '='://脱括号
						optr.pop();
						c=tc[++i];
						break;
				case '>'://栈顶元素优先权高
						char op=optr.pop();
						double opb=opnd.pop();
						double opa=opnd.pop();
						opnd.push(eva.Operate(opa,op,opb));
						break;
						}
			else{
				opnd.push(Double.parseDouble(String.valueOf(c)));
				c=tc[++i];
				}
			System.out.println("value of stack operater is :"+optr);
			System.out.println("value of stack operand is:"+opnd);
		}
		System.out.println("The result is: "+opnd.peek());

	}
}

运行程序:
输入一个简单的运算表达式,数字不能超过十:

Please enter a Expression and end with '#':3-6+6*3-(5-3+2)-6/2#
结果为
The result is: 8.0


不足之处:不能能够实现更为复杂的运算。操作数只能小于十。以及没有很好的容错能力。[/size]
分享到:
评论

相关推荐

    java课程设计-设计一个图形界面的计算器-完成简单的算术运算.doc

    关于数据存储问题 计算器完成的是一个数学表达式,本次课程设计我选用的是使用链表(Linkedlist类 )来存储数字和运算符号。程序运行后,输入的所有数字及运算符号都全部存储在链表中 ,待最后运算时,再一一求出来...

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

    remove方法对LinkedList类的使用3.3.5 关于ListIterator接口3.4 ArrayList类的实现3.4.1 基本类3.4.2 迭代器、Java嵌套类和内部类3.5 LinkedList类的实现3.6 栈ADT3.6.1 栈模型3.6.2 栈的实现3.6.3 应用3.7 队列...

    数据结构与算法分析-Java语言描述(第2版)_2_2

    remove方法对linkedlist类的使用 3.3.5 关于listiterator接口 3.4 arraylist类的实现 3.4.1 基本类 3.4.2 迭代器、java嵌套类和内部类 3.5 linkedlist类的实现 3.6 栈adt 3.6.1 栈模型 3.6.2 栈...

    数据结构与算法分析-Java语言描述(第2版)_1_2

    remove方法对linkedlist类的使用 3.3.5 关于listiterator接口 3.4 arraylist类的实现 3.4.1 基本类 3.4.2 迭代器、java嵌套类和内部类 3.5 linkedlist类的实现 3.6 栈adt 3.6.1 栈模型 3.6.2 栈...

    突破程序员基本功的16课.part2

    3.3.2 ArrayList和LinkedList的实现差异 3.3.3 ArrayList和LinkedList的性能分析和适用场景 3.4 Iterator迭代器 迭代时删除指定元素 3.5 小结 第4课 Java的内存回收 4.1 Java引用的种类 4.1.1 对象在内存中...

    数据结构与算法分析_Java语言描述(第2版)]

    remove方法对LinkedList类的使用3.3.5 关于ListIterator接口3.4 ArrayList类的实现3.4.1 基本类3.4.2 迭代器、Java嵌套类和内部类3.5 LinkedList类的实现3.6 栈ADT3.6.1 栈模型3.6.2 栈的实现3.6.3 应用3.7 队列...

    数据结构与算法分析 Java语言描述第2版

    remove方法对LinkedList类的使用3.3.5 关于ListIterator接口3.4 ArrayList类的实现3.4.1 基本类3.4.2 迭代器、Java嵌套类和内部类3.5 LinkedList类的实现3.6 栈ADT3.6.1 栈模型3.6.2 栈的实现3.6.3 应用3.7 队列...

    数据结构与算法分析_Java语言描述(第2版)

    《数据结构与算法分析:Java语言描述(第2版)》是国外数据结构与算法分析方面的经典教材,使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计)。...

    Java开发技术大全 电子版

    2.4.5位运算符和位运算表达式50 2.4.6赋值运算符和赋值表达式53 2.4.7表达式的求值顺序55 2.5流程控制语句58 2.5.1三种基本控制结构58 2.5.2表达式语句和空语句59 2.5.3块语句60 2.5.4if~else分支语句61 ...

    java基础案例与开发详解案例源码全

    3.5.3 表达式的运算顺序52 3.5.4 优先级和结合性问题52 3.6 选择结构54 3.6.1 顺序语句54 3.6.2 选择条件语句54 3.6.3 switch结构59 3.6.4 经验之谈-常见错误的分析与处理65 3.6.5 Switch和多重if结构比较66 3.7 ...

    超级有影响力霸气的Java面试题大全文档

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...

    java 面试题 总结

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...

    JAVA面试题最全集

    请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46....

    leetcode下载-leetcode:leetcode练习

    位运算 & | ^ ~ &gt;&gt; &lt;&lt; &gt;&gt;&gt; &lt;&lt;&lt; 的含义 == 和 equals。( == 数值相同也相同) 运算符优先级 for循环执行顺序 label + break/continue 的使用 二维数组的初始化 String 相关(不可变、安全、常量池...) ...

    21天学通Java-由浅入深

    62 第4章 流程控制(精彩视频:58分钟) 64 4.1 if条件语句 64 4.1.1 if语句的语法 64 4.1.2 if语句用法举例 64 4.2 switch分支语句 67 4.2.1 switch分支语句的语法 67 4.2.2 switch分支语句表达式的使用条件 68 ...

Global site tag (gtag.js) - Google Analytics