正文
Stack的java代码 java stacktrace
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
用一维整数数组实现数据结构中的堆栈(Stack)。(用java语言)
public class IntStack {
private int[] stack;
private int top;
/**
*初始化栈Stack的java代码,传入一个非负Stack的java代码的整数,否则抛出一个错误
*/
public IntStack(int size) throws StackErrorException{
if(size0){
throw new StackErrorException("错误的大小");
}
init(size);
}
private void init(int size) {
stack = new int[size];
top = 0;
}
/**
*判断栈是否为空,true则为空,反之则反
*/
public boolean isEmpty(){
return top==0;
}
/**
*判断栈是否已满,true则已满,反之则反
*/
public boolean isFull(){
return top==stack.length;
}
/**
*向栈顶添加元素,满则抛出异常
*/
public void push(int value) throws StackErrorException{
if(isFull()){
throw new StackErrorException("栈已满");
}
stack[top++] = value;
}
/**
*移除栈顶元素并返回,空则抛出异常
*/
public int pop() throws StackErrorException{
if(isEmpty()){
throw new StackErrorException("已到栈底!");
}
return stack[--top];
}
/**
*返回栈顶元素,空则抛出异常
*/
public int peek() throws StackErrorException{
if(isEmpty()){
throw new StackErrorException("已在栈底!");
}
return stack[top-1];
}
/**
*返回栈大小
*/
public int size(){
return stack.length;
}
class StackErrorException extends Exception{
public StackErrorException(String msg) {
super(msg);
}
}
}
java里Stack类怎么用啊?
如下示例代码
//Create the Stack instance and add a couple of elements to it
Stack stack = new Stack();
String s1 = "element 1";
String s2 = "element 2";
stack.push(s1);
stack.push(s2);
现在栈中有两个元素Stack的java代码,栈顶应该是element 2,Stack的java代码我们可以通过peek方法看栈顶Stack的java代码的元素Stack的java代码:
System.out.println(stack.peek());
输出:
element 2
要看element 1的位置需要使用search方法:
//Find position of a certain element
int pos = stack.search("element 1");
System.out.println(pos);
上面代码将输出:
2
要移除栈顶的元素应该用pop()方法:
System.out.println(stack.pop());
System.out.println(stack.pop());
输出:
element 2
element 1
在上一步中栈中的两个元素都被popStack的java代码了,现在我们看下empty()方法是否返回true
System.out.println(stack.empty());
输出:
true
java stack 问题
else if((list[i].equals(new String("}"))) (! stack.peek().equals(new String("{")))){
stack.peek挂了。
你的判断有问题,第2个}stack已经empty了,你再调用stack.peek()就会挂,判断里的stack.peek().equals(new String。。。这个方法要用之前得先判断stack是否为空。给你改了下循环,后面的输出你看着改把,有问题发消息:
for(int i=0;istr.length();i++){
if((list[i].equals(new String("(")))||(list[i]).equals(new String("["))||(list[i].equals(new String("{"))))
stack.push(list[i]);
else if((list[i].equals(new String(")"))) (stack.peek().equals(new String("("))) (! stack.isEmpty())){
stack.pop();
}
else if((list[i].equals(new String(")"))) (! stack.isEmpty()) (! stack.peek().equals(new String("(")))){
System.out.println("左右括号匹配不正确!");
return;
}
else if((list[i].equals(new String("]"))) (! stack.isEmpty()) (stack.peek().equals(new String("["))) ){
stack.pop();
}
else if((list[i].equals(new String("]"))) (! stack.isEmpty()) (! stack.peek().equals(new String("["))) ){
System.out.println("左右括号匹配不正确!");
return;
}
else if((list[i].equals(new String("}"))) (! stack.isEmpty()) (stack.peek().equals(new String("{"))) ){
stack.pop();
}
else if((list[i].equals(new String("}"))) (! stack.isEmpty()) (! stack.peek().equals(new String("{"))) ){
System.out.println("左右括号匹配不正确!");
return;
}
else if((list[i].equals(new String(")")))||(list[i].equals(new String("]")))||(list[i].equals(new String("}"))) (stack.isEmpty())){
System.out.println("右括号多于左括号!");
}
}
JAVA 编程,算法,编写一个名为StackExtension的类来扩展LinkedStack, 详细在图里,求代码、详细解答?
StackExtension类我测试过了,没有问题.
完整的StackExtension类如下
import dataStructures.LinkedStack;
public class StackExtension extends LinkedStack{
public int sum(){
int n=0;
int size=super.size();
for(int i=0;isize;i++){
n=n+Integer.parseInt(String.valueOf(super.pop()));
}
return n;
}
public String displayPalindromes(){
String s="";
int size=super.size();
for(int i=0;isize;i++){
s=s+String.valueOf(super.get(i))+" ";
}
for(int i=0;isize;i++){
s=s+String.valueOf(super.pop())+" ";
}
return s;
}
}
运行结果
关于JAVA中的Stack.pop()
字符串
+
的运算是连接的意思
即,把两个字符串连接在一起。
以你的代码为例:
String
x
=
"aaa";
String
b
=
"bbb";
x
=
x
+
b;
那么x的值是
aaabbb
深入Java虚拟机中的Stack和Heap
在JVM中 内存分为两个部分 Stack(栈)和Heap(堆) 这里 我们从JVM的内存管理原理的角度来认识Stack和Heap 并通过这些原理认清Java中静态方法和静态属性的问题
一般 JVM的内存分为两部分 Stack和Heap
Stack(栈)是JVM的内存指令区 Stack管理很简单 push一定长度字节的数据或者指令 Stack指针压栈相应的字节位移;pop一定字节长度数据或者指令 Stack指针弹栈 Stack的速度很快 管理很简单 并且每次操作的数据或者指令字节长度是已知的 所以Java 基本数据类型 Java 指令代码 常量都保存在Stack中
Heap(堆)是JVM的内存数据区 Heap 的管理很复杂 每次分配不定长的内存空间 专门用来保存对象的实例 在Heap 中分配一定的内存来保存对象实例 实际上也只是保存对象实例的属性值 属性的类型和对象本身的类型标记等 并不保存对象的方法(方法是指令 保存在Stack中) 在Heap 中分配一定的内存保存对象实例和对象的序列化比较类似 而对象实例在Heap 中分配好以后 需要在Stack中保存一个 字节的Heap 内存地址 用来定位该对象实例在Heap 中的位置 便于找到该对象实例
由于Stack的内存管理是顺序分配的 而且定长 不存在内存回收问题;而Heap 则是随机分配内存 不定长度 存在内存分配和回收的问题;因此在JVM中另有一个GC进程 定期扫描Heap 它根据Stack中保存的 字节对象地址扫描Heap 定位Heap 中这些对象 进行一些优化(例如合并空闲内存块什么的) 并且假设Heap 中没有扫描到的区域都是空闲的 统统refresh(实际上是把Stack中丢失了对象地址的无用对象清除了) 这就是垃圾收集的过程;关于垃圾收集的更深入讲解请参考 CTO之前的文章《JVM内存模型及垃圾收集策略解析》
JVM的体系结构
我们首先要搞清楚的是什么是数据以及什么是指令 然后要搞清楚对象的方法和对象的属性分别保存在哪里
)方法本身是指令的操作码部分 保存在Stack中;
)方法内部变量作为指令的操作数部分 跟在指令的操作码之后 保存在Stack中(实际上是简单类型保存在Stack中 对象类型在Stack中保存地址 在Heap 中保存值);上述的指令操作码和指令操作数构成了完整的Java 指令
)对象实例包括其属性值作为数据 保存在数据区Heap 中
非静态的对象属性作为对象实例的一部分保存在Heap 中 而对象实例必须通过Stack中保存的地址指针才能访问到 因此能否访问到对象实例以及它的非静态属性值完全取决于能否获得对象实例在Stack中的地址指针
非静态方法和静态方法的区别
非静态方法有一个和静态方法很重大的不同 非静态方法有一个隐含的传入参数 该参数是JVM给它的 和我们怎么写代码无关 这个隐含的参数就是对象实例在Stack中的地址指针 因此非静态方法(在Stack中的指令代码)总是可以找到自己的专用数据(在Heap 中的对象属性值) 当然非静态方法也必须获得该隐含参数 因此非静态方法在调用前 必须先new一个对象实例 获得Stack中的地址指针 否则JVM将无法将隐含参数传给非静态方法
静态方法无此隐含参数 因此也不需要new对象 只要class文件被ClassLoader load进入JVM的Stack 该静态方法即可被调用 当然此时静态方法是存取不到Heap 中的对象属性的
总结一下该过程 当一个class文件被ClassLoader load进入JVM后 方法指令保存在Stack中 此时Heap 区没有数据 然后程序技术器开始执行指令 如果是静态方法 直接依次执行指令代码 当然此时指令代码是不能访问Heap 数据区的;如果是非静态方法 由于隐含参数没有值 会报错 因此在非静态方法执行前 要先new对象 在Heap 中分配数据 并把Stack中的地址指针交给非静态方法 这样程序技术器依次执行指令 而指令代码此时能够访问到Heap 数据区了
静态属性和动态属性
前面提到对象实例以及动态属性都是保存在Heap 中的 而Heap 必须通过Stack中的地址指针才能够被指令(类的方法)访问到 因此可以推断出 静态属性是保存在Stack中的 而不同于动态属性保存在Heap 中 正因为都是在Stack中 而Stack中指令和数据都是定长的 因此很容易算出偏移量 也因此不管什么指令(类的方法) 都可以访问到类的静态属性 也正因为静态属性被保存在Stack中 所以具有了全局属性
lishixinzhi/Article/program/Java/hx/201311/26460
Stack的java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java stacktrace、Stack的java代码的信息别忘了在本站进行查找喔。