2 qq 30151545 qq_30151545 于 2016.01.27 14:25 提问

java中++a和a++ 在数组实现栈中的小疑问

package 数组实现栈;

public class StackArray implements Stack {
public static final int num = 1024;//数组默认容量
public int capacity;//数组实际容量
public Object s[];//对象数组
public int top = -1;//栈顶元素位置

//构建默认容量栈对象
public StackArray() {
    this(num);
}

//构建指定容量栈对象
public StackArray(int a) {
    capacity = a;
    s = new Object[capacity];
}

//获取栈当前容量
public int getSize() {  
    return(top+1);
}

//判断栈是否为空
public boolean isEmpty() {
    return(top<0);
}

//入栈
public void push(Object obj) throws ExceptionStackFull {
    if(getSize() == capacity) {
        throw new ExceptionStackFull("栈溢出");
    }
    else {
        s[++top] = obj;             // ?????????????  想问下top++为什么不行
    }
}

//取栈顶元素
public Object top() throws ExceptionStackEmpty {
    if(isEmpty()) {
        throw new ExceptionStackEmpty("栈空");
    }
    else {
        return s[top];
    }
}

//出栈
public Object pop() throws ExceptionStackEmpty {
    if(isEmpty()) {
        throw new ExceptionStackEmpty("栈空");
    }
    else {
        Object a = s[top];
        s[top--] = null;           //????????????  出栈时不是把s[top]赋空值吗 怎么是s[top--]
        return a;
    }
}

}

我在用这栈来实现倒置时前面只能是++top 和 top-- 否则出现数组越界
倒置的代码如下
package 数组实现栈;

public class daozhi {
public static void main(String[] args) {
Integer b[] = { 1, 2, 3, 4, 5 };
reverse(b);

    for (int i = 0; i < b.length; i++) {
        System.out.println(b[i]);
    }

}

// 实现数组倒置
public static Integer[] reverse(Integer a[]) {
    StackArray s = new StackArray(a.length);
    // Integer n[] = new Integer[a.length];
    for (int i = 0; i < a.length; i++) {
        s.push(a[i]);
    }
    for (int i = 0; i < a.length; i++) {
        a[i] = (Integer) s.pop();
    }
    return a;
}

}

4个回答

chen956
chen956   2016.01.27 16:23
已采纳

top++是先取s[top]的值,top再加一,如果使用这个,top一开始是-1,我看上面也没有判断top是否是小于0,所以会出现数组越界

chen956
chen956 回复无清: 原理是一样的,s[top--]是先执行是s[top]=null,再执行top--。++/--在变量前在先执行++/--,若++/--在变量之后则先执行语句,在执行++/--
2 年多之前 回复
qq_30151545
qq_30151545 额谢谢 想问下面出栈为什么是s[top--] 不是s[top]
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.01.27 18:50

说明没有走到 s[++top] = obj;这个分支,走到的话,肯定是执行的。

cuiwei1026522829
cuiwei1026522829   Ds   Rxr 2016.01.27 20:23

s[top--]是两步合成了,先出战,然后指针减少1

91program
91program   Ds   Rxr 2016.01.27 16:29

++/-- 运算符的运行规则是先执行语句,再执行++/--,即 加一/减一的动作。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
数据结构--一个数组实现两个栈
用一个数组实现两个栈,通常我们会想到以下几种方案: 1.奇偶栈,即就是将数组的偶数位置看作一个栈的存储空间,将奇数位置看作另一个栈的存储空间。 2.从中间分别向两边展开,即就是将数组的中间位置看作是两个栈的栈底,压栈时栈顶指针分别向两边移动,当任何一边到达数组的起始位置或是数组尾部就开始扩容。 3.从两边向中间压栈,就是将数组的起始位置看作是一个栈的栈底,将数组的尾部看作是另
关于Java中两个数组的复制(b=a)
b=a; a=b; 只是把地址给传过去了吧 其中一个改变另一个也当然会改变 他们指向的是同一个东西啊
java语言基础数组选择排序从小到大-作者:逝秋
class Text1 { //选择排序:从小到大 public static void main(String[] args) { int[]arr=new int[]{12,9,56,45,10}; for (int c=0;c<arr.length;c++ )//控制从角标o到数组.length-1的比较次数 { for (int b=c+1;b<
用选择排序法对数组进行排序
在比较的过程中,利用index记录较小数值的下标。用index进行判断是否进行交换。对于数组中元素较多,可以减少比较次数,提高排序效率。public static void main(String[] args){ int i,j,temp; int[] array={-6,5,10,30,-9,25,6,9,18}; for(i=0;i<array.length-1;i++) {
java用数组实现栈
1.1.  栈的数据结构 栈是一种先进后出的数据结果,只能在一端(称为栈顶(top))对数据项进行插入和删除。 1.2.  Java实现 StackTest package ch04; public class StackTest { public static void main(String[] args) { Arra
Python实现返回数组第i小的元素
#! /usr/bin/env python #coding=utf-8 #期望为线性时间的选择算法 import random class RandomSelect(object): def Partition(self,a, p, r): x=a[r] i=p-1 for j in range(p, r): '''如
用java数组实现栈
栈是一种常见的数据结构。如果用一句话来概括栈的特点,估计大部分同学都能脱口而出:后进先出,即先进来的元素保存在栈的最底部,新来的元素则在栈顶堆积,直到栈满为止;而取元素的时候,只能从栈顶取,直到栈空为止。整个过程,与摞书的过程很类似:放书的时候都是摞在最上面,取书的时候也是从最上面开始取。要想取出下面的书,就必须先将上面的书先取走。原理就讲这么多,本身也比较简单。接下来,照例是咱们的口号: tal
用栈来实现求数组中每个元素的左边第一个小和右边第一个小 -2014-03-26 20:35
数组中每个元素的左边第一个小和右边第一个小: 如[2,1,5,6,2,3]中5左边第一个小的元素是1,右边第一个小的元素是2; 如何在复杂度为O(n)的情况下计算出所有元素的左边第一个小和右边第一个小? 这是leetcode中的“ Largest Rectangle in Histogram ”,原题是求柱状图中面积最大的矩形。 如: 的面积最大矩形就是图中的阴影部分,即10
Java 用数组实现栈 (Stack),包括栈的初始化,入栈、出栈等操作
这是以前面试搜狐碰上的一道笔试题:用数组的方式实现Stack,
编程分别输入两个按从小到大排序的数组a和b,将这两个有序数组合并,使合并后的数组仍有序 (从小到大)
#include"stdio.h" main() { while(1==1){ int  a[5],b[5],c[10],i,j,k=0 ; printf("Enter a \n");  for(i=0; i scanf("%d", &a[i]); printf("Enter b \n");   for(i=0; i scanf("%d", &b[i]); i=j=0; w