package ArrayStack;
public class ArratStack {
/*
* 栈的大小
* */
private int maxStack;
/*
* 使用数组模拟栈
* */
private int[] stack;
/*
* 表示栈顶位置,默认时栈顶指针为-1
* 栈顶指针指向栈顶元素位置
* */
private int top = -1;
/*
* 栈的构造方法,传入参数规定栈的大小
* */
public ArratStack(int maxStack) {
this.maxStack = maxStack;
stack = new int[maxStack];
}
//栈的相关方法有:出栈,入栈,判空,判满
//判满
public boolean isFUll(){
return this.top == this.maxStack-1;
}
//判空
public boolean isEmpty(){
return this.top == -1;
}
//入栈
public void push(int var){
if (isFUll()){
throw new RuntimeException("栈已经满了");
}
stack[++top] = var;
}
//出栈
public int pop(){
if (isEmpty()){
throw new RuntimeException("栈是空的");
}
return stack[top--];
}
//查看栈中所有的元素
public void list(){
if (isEmpty()){
throw new RuntimeException("栈是空的");
}
for (int value:stack
) {
System.out.println(value);
}
}
//获取栈中元素的个数
public int getLength(){
return stack.length;//应该纠正为return this.top+1;
}
}
package ArrayStack;
/*
* 通过栈的数据结构来判断一个字符串是否是回文字符串*/
public class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.detect("abc"));
}
public boolean detect(String s){
ArratStack arratStack = new ArratStack(10);
for (int i = 0; i < s.length(); i++) {
arratStack.push(s.charAt(i));
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < arratStack.getLength(); i++) {//订正为:int length = arratStack.getLength();循环修改为for(..i<length..)
char c = (char) arratStack.pop();
builder.append(c);
}
if (builder.equals(s)+""){
return true;
}else{
return false;
}
}
}
结果:
原因分析:在获取栈中元素的个数时,使用的是return stack.length,返回的是栈的容量而不是栈中元素的个数,应该改为return this.top+1
还有需要注意的点是,在编写ArrayStack构造方法时,容易忽略创建stack对象既代码stack = new int[maxStack];
修改后运行结果
输入aba
由debug分析可知,当栈中元素出栈时,循环条件编写错误,arrayStack.getLength()会随着出栈而变化,因此到最后一个字符出栈时不满足循环条件会结束循环导致最后一个元素获取不到。应该单独创建一个int类型的属性作为循环条件。