中易网

java stack 问题

答案:3  悬赏:0  
解决时间 2021-03-12 19:17
我用stack类 进行括号匹配问题。。代码如下
import java.util.*;
public class expTest{
public static void main(String[] args) throws Exception{
Stack stack=new Stack();

Scanner sc=new Scanner(System.in);
System.out.print("请输入一括号表达式:");
String str=sc.next();
String[] list=new String[str.length()];
for(int i=0;i String ss=str.substring(i, i+1);
list[i]=ss;
}

for(int i=0;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.peek().equals(new String("(")))){
System.out.println("左右括号匹配不正确!");
return;
}
else if((list[i].equals(new String("]"))) && (stack.peek().equals(new String("["))) && (! stack.isEmpty())){
stack.pop();

}
else if((list[i].equals(new String("]"))) && (! stack.peek().equals(new String("[")))){
System.out.println("左右括号匹配不正确!");
return;
}
else if((list[i].equals(new String("}"))) && (stack.peek().equals(new String("{"))) && (! stack.isEmpty())){
stack.pop();

}
else if((list[i].equals(new String("}"))) && (! 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("右括号多于左括号!");
}
}
if(! stack.isEmpty())
System.out.println("左括号多于右括号!");
else
System.out.println("括号匹配正确!");
}

}
运行,当我这样输入的时候:

请输入一括号表达式:{}}}}
Exception in thread "main" java.util.EmptyStackException

抛出了异常。。。请问这哪里出错了。。求助高手
最佳答案
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;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("右括号多于左括号!");
}
}
全部回答
我没仔细看你的代码,但是有个问题题我要给你说一下。就是String类的subString(begin,end)方法截取的字符串是String索引位置从begin到(end-1)。你看看你的代码,像你那样截取实际上时没有截取的。
闲着实在无聊...... 写了个简单的双链表实现stack。未引用任何包。 public class main { public static void main(string[] args) { stack s = new stack(); s.put("abc");//压栈 s.put("def");//压栈 s.put("ghi"); system.out.println(s.pop());//出栈 system.out.println(s.isempty());//判断栈是否为空 system.out.println(s.pop()); system.out.println(s.isempty()); system.out.println(s.pop()); system.out.println(s.isempty()); } } class stack { private node root = new node(); private node top = root; public object pop() { if(top != null) { object value = top.getvalue(); top = top.getprevious(); return value; } else { return null; } } public void put(object value) { node n = new node(top, value); top.setnext(n); top = n; } public boolean isempty() { return top.getprevious() == null; } } class node { private node next; private object value; private node previous; public node() { } public node(node previous, object value) { this.previous = previous; this.value = value; } public node getnext() { return next; } public void setnext(node next) { this.next = next; } public object getvalue() { return value; } public void setvalue(object value) { this.value = value; } public node getprevious() { return previous; } public void setprevious(node previous) { this.previous = previous; } }
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
汽车过户有行驶证,合格证,机动车登记证,还要
1.5米的19岁,可以进女团吗
仕达汽修在什么地方啊,我要过去处理事情
一个月不吃饭会死吗
有首歌歌词有我也可以
以暑假生活为话题的作文
吉林辽源到辽宁桓仁的路线及距离
在实施供给侧改革中,我国采取了哪些财政政策
请问高考中落榜的人大约占多大比例?
五谷香粮油店我想知道这个在什么地方
什么茶能够凉着喝
12颗星是什么国的标志
九阳电磁炉煎炸功能没反应是怎么回事,买过来
农家绿色食府地址在什么地方,想过去办事
2014款宝马320i是什么牌子的音响
推荐资讯
朗动六速手动怎么开省油
有谁看过日月神剑?知道主演是谁吗?
经济学中经济活动外部性的问题。
NBA2Konline里面自己的球员首发怎么更换?怎
要想已末知,下一句是(除非)什么呢?
在云联惠什么都可以买到吗?
乞求是什么意思?,
车用天然气和车用lpg液化气各有什么优缺点
长征摩托城国富特约维修站这个地址在什么地方
廊坊“一体两翼”指的是什么?
引起肛门出血原因有哪些
五菱荣光v哪款有电动助力系统?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?