hdu1237(简单计算器) LinkedList类实现栈和队列功能

点击打开链接

Problem Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output

3.00
13.36

思路:用两个集合来分别存放符号和数字,之所说集合是因为在存放和计算时,即用到了队列,也用到了栈的思想,所以单独的说用哪个都不准确。

具体操作:在存符号时,若遇见乘或者除,则直接用这个符号计算其两边的数,这就需要将数字集合中的最后一个进入的数拿出来,也就是后进先出(栈),然后将结果在放入数字栈中,经过这样的处理,全部放完后,就相当于只有加减两个运算

的式子了,这样就可以用队列思想,先进先出,一次按顺序计算即可。

实现代码:

package collection;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

public class P1237 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String str;
		String[] strs;
		while(sc.hasNext()){
			str=sc.nextLine();//这里要用nextLine
			if(str.compareTo("0")==0){
				break;
			}
			strs=str.split(" ");//然后通过split用空格将所有的数字和符号分开
//			for(int i=0;i<strs.length;i++){
//				System.out.print(strs[i]);
//			}
//			System.out.println();
			LinkedList<Double> numQue=new LinkedList<Double>();//创建两个链表集合,既可以当做栈来运行,又可以当做队列来运算
			LinkedList<String> signQue=new LinkedList<String>();
			double mid=0.0;
			for(int i=0;i<strs.length;i++){
				if((i+1)%2==0){//因为题目说了是规范的式子,所有偶数一定是符号,奇数就是数字
					if(strs[i].compareTo("*")==0){//若是乘除符号,则将从数字栈中取出一个数,与下一将要存放的数字继续对应的运算
						mid=numQue.getLast()*Double.parseDouble(strs[i+1]);
					}else if(strs[i].compareTo("/")==0){
						mid=numQue.getLast()/Double.parseDouble(strs[i+1]);
					}else{//若不是,则入队列
						signQue.add(strs[i]);
						continue;
					}
//					System.out.println(strs[i]+mid);
					i=i+1;//若是乘除,因为下一个已经做了运算,所以可以直接跳到下二个,也就是下一个符号
					numQue.pollLast();
					numQue.add(mid);//用乘除相邻的两个数代替下一个数,所以让i=i+1
				}else{
					numQue.add(Double.parseDouble(strs[i]));//否则数字入队
				}
			}

//			Iterator<Double> it=numQue.iterator();
//			while(it.hasNext()){
//				System.out.print(it.next()+" ");
//			}
//			Iterator<String> it2=signQue.iterator();
//			while(it2.hasNext()){
//				System.out.print(it2.next()+" ");
//			}

			double result=numQue.pollFirst();//因为放完后,符号队列一定比数字队列少一个,所以先拿出一个数字
			String sign;
			while(!signQue.isEmpty()){//然后让符号出队,同时让数子也出队,直到为空
				sign=signQue.pollFirst();
				if(sign.compareTo("+")==0){
					result+=numQue.pollFirst();
				}else{
					result-=numQue.pollFirst();
				}
			}
			System.out.printf("%.2f",result);
			System.out.println();
		}
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 20:30:53

hdu1237(简单计算器) LinkedList类实现栈和队列功能的相关文章

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

hdu1237 简单计算器 (模拟+栈)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15075    Accepted Submission(s): 5132 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,

HDU 1237 简单计算器(后缀式+栈)

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 16351    Accepted Submission(s): 5604 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,

简单数据结构(四)栈和队列的简单应用

     编程判断一个字符串是否是回文.回文是指一个字符序列以中间字符为基准两边字符完全相同,如字符序列" ACBDEDBCA"是回文.      算法思想:判断一个字符序列是否是回文,就是把第一个字符与最后一个字符相比较,第二个字符与倒数第二个字符比较,依次类推,第 i 个字符与第 n-i个字符比较.如果每次比较都相等,则为回文,如果某次比较不相等,就不是回文.因此,可以把字符序列分别入队列和栈,然后逐个出队列和出栈并比较出队列的字符和出栈的字符是否相等,若全部相等则该字符序列就是回

简单方法快速记忆数组栈和队列函数

在js中,对数组的操作是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,今天来给大家用通俗易懂.简洁明了的几行文字,来告诉大家栈和队列的几个函数,如何快速记住. 首先,概念还是要知道的: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻

hdu-1237简单计算器(栈的运用)

http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第一个运算符分别压 如个自的栈,然后判取出两个栈头部的元素,判断符号,如果是乘除就用当前数值乘取出的数字(优先),然后将乘后的数压入栈, 如果是加则将数和取出的数按原序入栈,如果减,就把新的数变负,将数和取出的数按原序入栈. 最后栈中所有元素的和就是结果. 1 #include<stdio.h> 2

[笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列

python数据结构之线性表 python内置了很多高级数据结构,list,dict,tuple,string,set等,在使用的时候十分舒心.但是,如果从一个初学者的角度利用python学习数据结构时,这些高级的数据结构可能给我们以迷惑. 比如,使用list实现queue的时候,入队操作append()时间复杂度可以认为是O(1),但是,出队操作pop(0)的时间复杂度就是O(n). 如果是想利用python学学数据结构的话,我觉得还是自己实现一遍基本的数据结构为好. 1.链表 在这里,我想使

用两个栈实现队列功能【剑指offer】

题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 程序代码: [方法一] 1 class Solution 2 { 3 public: 4 5 void push(int node) { 6 stack1.push(node); 7 8 9 } 10 11 int pop() { 12 int a; 13 if (stack2.size() <= 0){ 14 while (stack1.size()>0){ 15 a = stack1.top(

简单计算器 java实现hdu1237

简单计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15190    Accepted Submission(s): 5184 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,