java中的stack

stack为ADT中的一种数据结构,该结构特点是先进后出,Stack继承了Vector,Vector继承了AbstractList类,由此可见Stack也是集合。他的实现方法一般有两种:

一种为单链表(node只有一个next指针的LinkedList),另一种是是数组。jdk中是以数组实现的。

1.栈的特点为先进后出。

栈中的一些常用方法:

pop()从栈中弹一个出来(即从栈顶删除一个元素,返回该元素),

peek()获取栈顶元素(不从栈顶删除),

push(E e)压入一个元素到栈顶(即从栈顶添加一个元素),

empty(判断栈是否为空),

search(Object o)从栈中搜索一个元素。

以上为Stack中的实现的所有方法。

2.栈的应用

如何计算表达式  a+b*c+(d*e+f)*g

1.要计算这个表达式,首先要知道后序表达式

通常我们用到的表达式为中序表达式,即运算符号在运算值的中间,就像a+b,  a+b*c+(d*e+f)*g,

但其实还有另一种表达式,叫后续表达式。该表达式是将运算符号放在运算值后来进行计算的,

如:a+b 写成 ab+,  a+b*c写成 abc*+,  a+b*c+d+e/f写成 abc*+def/++

中序表达式如何转换为后序表达式,例如String str = a+b*c+(d*e+f)*g

1.首先有两个存储的对象,一个为后序表达式的结果值可变字符串sf,一个存储运算符号的stack

2.遍历字符串str,获取每一项的值item,如果是运算值(abc),添加到sf;

如果是运算符号:

1)如果是 */( 直接添加到stack

2)如果是 +- ,

如果stack栈顶的元素为+-或空的时候直接添加到stack,

如果为*/则弹出stack中的所有元素( 如果有(,则弹到( ),然后添加到sf中。然后将+-压入stack

3)如果是 ) , 弹出(之前的所有元素,然后添加到sf中

3.弹出stack中所有的元素,然后添加到sf中

下边是代码

private static Set<String> diginal = new HashSet<String>();//存放表达式中的运算符号

private static boolean flag = false;//判断有没有(

public static void main(String[] args) {
String str = "a+b*c+(d*e+f)*g";
Pattern p = Pattern.compile("[+*()-/]");
Matcher m = p.matcher(str);
while(m.find()){
String item = m.group();
diginal.add(item);
}
}

/**
* 中序表达式转后续表达式
* @param str
* @return
*/
public static String transfer(String str){
StringBuffer sf = new StringBuffer();
Stack<Character> stack = new Stack<Character>();
for(int i=0;i<str.length();i++){
char item = str.charAt(i);
if(!diginal.contains(item+"")){
sf.append(item);
}else{
if(item == ‘+‘ || item == ‘-‘){
if(!stack.isEmpty() && (stack.peek() == ‘*‘ || stack.peek() == ‘/‘)){
while(!stack.isEmpty()){
if(true && stack.peek() == ‘(‘){
break;
}
sf.append(stack.pop());
}
stack.push(item);
}else{
stack.push(item);
}
}else if(item == ‘)‘){
while(stack.peek() != ‘(‘){
sf.append(stack.pop());
}
stack.pop();
}else{
if(item == ‘(‘){
flag = true;
}
stack.add(item);
}

}
}
while(!stack.isEmpty()){
sf.append(stack.pop());
}
return sf.toString();
}

2.通过后序表达式计算值(只给出结果形式的字符串,)

1.初始化两个变量, 结果字符串sf,存放运算值的stack

2.遍历后序表达式字符串str, 每一项为item

3.当item为运算值的时候, 添加到stack, 如果是+-*/,则从stack栈顶弹出两个元素, 然后进行运算, 然后将结果值压入到stack中。

下边是代码

/**
* 计算
* @return
*/
public static String cal(String str){
Stack<String> stack = new Stack<String>();
StringBuffer sf = new StringBuffer();
for(int i=0,n=str.length();i<n;i++){
char item = str.charAt(i);
if(!(item == ‘+‘ || item == ‘-‘ || item == ‘*‘ || item == ‘/‘)){
stack.push(item+"");
}else{
String b = stack.pop();
String a = stack.pop();
sf.append(b).append(item).append(a);
stack.push("(" + b+item+a + ")");//用括号括起来表明计算结果
}
}

return stack.pop();
}

时间: 2024-10-17 09:28:21

java中的stack的相关文章

java中堆栈(stack)和堆(heap)

原文地址:http://blog.csdn.net/jerryao/article/details/874101 1.内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. (1)静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求 (2)栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个

java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)

(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为 它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存 储分配相反,在栈式存储方案中,程序对

深入Java虚拟机:JVM中的Stack和Heap

转自:http://www.cnblogs.com/laoyangHJ/archive/2011/08/17/gc-Stack.html —————————————————————————————————————————————— 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的内存分为两部分:Stack和Heap. Stack(栈)是JVM的内

java 中的内存分为四个部分:stack(栈),heap(堆),data segment

http://www.qdmm.com/BookReader/113167,54166719.aspx http://www.qdmm.com/BookReader/113167,54166867.aspx http://www.qdmm.com/BookReader/113167,54166868.aspx http://www.qdmm.com/BookReader/113167,54166869.aspx http://www.qdmm.com/BookReader/113167,5416

Java虚拟机JVM总结(一)JVM运行原理及JVM中的Stack和Heap的实现过程

Java语言写的源程序通过Java编译器,编译成与平台无关的'字节码程序'(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器. 一.JVM原理 1.JVM简介: JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. java编译器只要面向JVM,生成JVM能理解

java中List、Map、Set、Collection、Stack、Queue等的使用

java中这几个东西是比较常用的,虽然我用的不多,也正是因为用的不多,所以我一直搞不清楚他们之间的具体用法以及相互之间的关系,现在特单独作为一个东西来总结一下. 本文参考一下资料: 1.<java编程思想>一书第11章 2.http://blog.sina.com.cn/s/blog_a345a8960101k9vx.html 3.http://f51889920.iteye.com/blog/1884810 4.http://blog.csdn.net/speedme/article/det

Java中的堆栈API——Stack

堆栈(stack)是线性表的一种,只能在该线性表的表尾进行插入.获取或删除的操作.该线性表具有LIFO(后进先出)的特点,那么Java中如何实现这一功能呢,呵呵呵,Java已经为我们提供了API--Stack,Stack类继承Vector类.下面通过一个例子来认识一下该API: import java.util.Stack; public class TestStack { public static void main(String[] args) { Stack<String> stack

java中List、Map、Set、Stack、Queue、Collections等的使用

java中List.Map.Set.Stack.Queue.Collections等的使用 List 创建方法: List<String> list=new ArrayList<>(); add(val) : 添加元素. get(index) : 获取元素. remove(index) : 删除元素. remove(Object o) : 按照元素内容删除 {eg:list.add("marry") ; list.remove(0)==list.remove(&

java中String s="abc"及String s=new String("abc")详解

1.   栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2.   栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共 享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要 在运行时动态分配内存,存取速度较慢. ==是判断