Dijkstra的双栈算术表达式求值算法:

 import java.util.*;
public class Main
{
public static double evaluate(String abs) {
Stack<String> ops = new Stack<String>();
Stack<Double> vals = new Stack<Double>();
char arr[]=abs.toCharArray();
for(char c:arr){
String s=c+"";
if(s.equals(""));
else if(s.equals("("));
else if (s.equals("+")) ops.push(s);
else if (s.equals("-")) ops.push(s);
else if (s.equals("*")) ops.push(s);
else if (s.equals("/")) ops.push(s);
else if (s.equals(")"))
{
String op=ops.pop();
double v=vals.pop();
if(op.equals("*")) v=vals.pop()*v;
else if(op.equals("+")) v=vals.pop()+v;
else if(op.equals("-")) v=vals.pop()-v;
else if(op.equals("/")) v=vals.pop()/v;
vals.push(v);
}
else vals.push(Double.parseDouble(s));
}
return vals.pop();
}
public static void main(String args[])
{
Scanner s=new Scanner(System.in);
String s1=s.next();
System.out.print(evaluate(s1));
}
}

下压栈(LIFO)能够动态调整数组大小的实现

 import java.util.*;
import java.lang.*;
public class Main<Item> implements Iterable<Item> {
private Item[] a = (Item[])new Object[1];//栈元素
private int N = 0;//元素数量 public boolean isEmpty(){
return N == 0;
} public int size(){
return N;
} public void resize(int max){
Item[] temp = (Item[])new Object[max];
for(int i = 0;i<N;i++){
temp[i] = a[i];
}
a = temp;
} public void push(Item item){
if(N == a.length) resize( 2 * a.length);
a[N++] = item;
} public Item pop(){
Item item = a[--N];
a[N] = null;
if(N>0 && N == a.length/4) resize(a.length/2);
return item;
} // @Override
public Iterator<Item> iterator() {
return new ReverseArrayIterator();
} private class ReverseArrayIterator implements Iterator<Item>{
private int i = N;
public boolean hasNext() {
return i > 0;
} public Item next() {
return a[--i];
} // @Override
public void remove() {
throw new UnsupportedOperationException();
} }
public static void main(String args[])
{
Main<String> s=new Main<String>();
Scanner cin=new Scanner(System.in);
System.out.println("Input a String end with $:");
while(cin.hasNext()){
String item=cin.next();
if(item.equals("$")){
break;
}
else {
s.push(item);
}
}
// foreach语句是while语句的一种简写方式
System.out.println("display by for:");
for(String str : s){
System.out.print(str+" ");
}
System.out.println();
// which
System.out.println("display by which:");
Iterator<String> it=s.iterator();
while(it.hasNext()){
String i=it.next();
System.out.print(i+" ");
}
} }

Java 算法(背包,队列和栈)的更多相关文章

  1. java算法--普通队列

    数据结构队列 首先明确一下队列的概念. 队列是一种有序列表,使用数组的结构来存储队列的数据. 队列是一种先进先出的算法.由前端加入,由后端输出. 如下图: ​ 第一个图 第二个图 第三个图 这就是队列 ...

  2. java算法--循环队列

    循环队列 我们再用队列得时候不知道发没发现这样一个问题. 这是一个只有三个位置得队列,在进行三次加入(addqueue)操作和三次取出(get)操作之后再进行加入操作时候的样子.明显可以看到,队列已经 ...

  3. java算法-单向队列

    队列是一种:先进先出,后进后出的数据结构 单项队列: 从前面删除元素,从后面插入元素,跟现实中排队是一样的道理 这里我们用指针移动位置的方法.因为数组删除元素,如果我们要跟现实中排队效果一样,就需要移 ...

  4. Java数据结构和算法(四)——栈

    前面我们讲解了数组,数组更多的是用来进行数据的存储,纯粹用来存储数据的数据结构,我们期望的是插入.删除和查找性能都比较好.对于无序数组,插入快,但是删除和查找都很慢,为了解决这些问题,后面我们会讲解比 ...

  5. 算法<初级> - 第二章 队列、栈、哈希表相关问题

    算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...

  6. C语言算法系列---1.队列和栈

    写在前面:在家玩了好久,实在是不知道干嘛了,突然想找些事做,现在是时候做些什么了.这些东西不见得多高深,也可能很简单,但很基础,也无法忽视.同时,也是自己学习走过的一条路. 这是开头,就写写C的队列和 ...

  7. 两个栈实现队列+两个队列实现栈----java

                                               两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后所有出s ...

  8. 图解堆算法、链表、栈与队列(Mark)

    原文地址: 图解堆算法.链表.栈与队列(多图预警) 堆(heap),是一类特殊的数据结构的统称.它通常被看作一棵树的数组对象.在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间 ...

  9. java 队列和栈及示例

    一.栈的实现: 1.Stack实现 接口实现: class Stack<E> extends Vector<E> {......} 常用的api函数如下: boolean is ...

  10. Java实现 蓝桥杯 算法提高 队列操作

    算法提高 队列操作 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. 输入格式 ...

随机推荐

  1. SpringData Redis

    Redis spring-data-redis

  2. springboot ----> sts如何启动两个实例

    idea 实现启动两个spring boot工程实例的方法 可以参考这篇博客. 因为使用spring tool suite 学习spring cloud 需要实例化两个spring boot 工程来构 ...

  3. English trip V1 - B 15. Giving Personal Information 提供个人信息 Teacher:Solo Key: Do/Does

    In this lesson you will learn to answer simple questions about yourself.  本节课讲学到回答关于自己的一些简单问题 课上内容(L ...

  4. WCF利用Stream上传大文件

    WCF利用Stream上传大文件 转自别人的文章,学习这个例子,基本上wcf也算入门了,接口用法.系统配置都有了 本文展示了在asp.net中利用wcf的stream方式传输大文件,解决了大文件上传问 ...

  5. Practical Node.js (2018版) 第3章:测试/Mocha.js, Chai.js, Expect.js

    TDD and BDD for Node.js with Mocha TDD测试驱动开发.自动测试代码. BDD: behavior-driven development行为驱动开发,基于TDD.一种 ...

  6. Vue.js示例:文本编辑器。使用_.debounce()反抖动函数

    Markdown编辑器 https://cn.vuejs.org/v2/examples/index.html 新知识: Underscore.js库 用于弥补标准库,方便了JavaScript的编程 ...

  7. es的分词器analyzer

    analyzer   分词器使用的两个情形:  1,Index time analysis.  创建或者更新文档时,会对文档进行分词2,Search time analysis.  查询时,对查询语句 ...

  8. 求[1,n]中与m互素的个数

    void dfs(int d, ll num, int z) { if (d>cnt) { if (num!=1) ans+=z*n/num; } else { dfs(d+1,num*p[d] ...

  9. 21. Merge Two Sorted Lists (Java 合并有序链表 空间复杂度O(1))

    题目: Merge two sorted linked lists and return it as a new list. The new list should be made by splici ...

  10. XXE漏洞

    原理:XML外部实体注入,简称XXE漏洞,XML数据在传输中数据被修改,服务器执行被恶意插入的代码.当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取.系统命令执行.内网端口探测.攻击内网 ...