1

我想编写一个程序,以便能够从标准输入接收字符串并检查匹配的括号。这是我的堆栈代码:

    public interface Stack<E>{
    public int size();
    public boolean isEmpty();
    public E top();
    public void push(E element);
    public E pop()throws EmptyStackException;
    }

这是一个名为 MyStack 的类,它实现了堆栈:

    public  class myStack<E> implements Stack<E>{
    private final E s[];
    int t=0;
    public myStack() {
    this.s = (E[]) new Object[100];
    }
    public int size(){
    return t;
    }

    public boolean isEmpty(){
    switch(size()){
        case 0:
            return true;
    }
    return false;
    }

    public E top() {
    if(isEmpty())
        throw new EmptyStackException();
    return s[t-1];
    }


    public void push(E element) {
     if(isEmpty())
        s[0]= element;
     else
        s[t]= element;
     t++;
    }
    public E pop() {
    E x;
    if(isEmpty())
        throw new EmptyStackException();
    else{
        x = s[t-1];
        s[t-1] = null;
        t--;
    }
    return x;
    }

    }

这是主要的:

      public static void main(String[] args) {

      Stack<String> st=new myStack<>(); 
      Scanner s = new Scanner(System.in);
      String str;
      str = s.nextLine();
      for(int i=0;i<str.length();i++)
      {
        if((str.charAt(i)=='{')||(str.charAt(i)=='(')||(str.charAt(i)=='['))
        {
            st.push(str.charAt(i));
        }
        else if((str.charAt(i)=='}')||(str.charAt(i)==')')||(str.charAt(i)==']'))
            if((st.top()==str.charAt(i)))
                    st.pop();
            else 
            {
                System.out.println("Error");
                System.exit(0);
            }
     }


     if(st.isEmpty())
        System.out.println("True");
     else
        System.out.println("True");
     }

但是主要代码在这些行中有错误: st.push(str.charAt(i)); And if((st.top()==str.charAt(i))). 错误是关于将字符转换为字符串。

任何人都可以帮我解决这些问题吗?

抱歉,我知道这么长的代码很无聊,但我真的需要解决这个问题

提前感谢您的关注

4

2 回答 2

2

您应该在 main 方法中使用一堆字符:

Stack<Character> st = new myStack<>();

一旦你编译它,你也会发现你的逻辑有一些错误。例如,在您读取堆栈时的表达式中(aa),因此您不能只进行比较,而是需要考虑这一点。)(

于 2013-11-08T17:18:31.037 回答
1

我在这里看到两个选项。第一个被声明并使用一堆字符。另一种是将 char 转换为 Character,然后在推送到堆栈之前调用 .toString() 方法。

您的推送看起来像:

st.push(((Character)str.charAt(i)).toString());

和你的流行音乐:

if((st.top().equals(((Character)str.charAt(i)).toString()))
    st.pop();

您可能必须使用 .equals(Object) 方法来正确确定字符串/字符是否相等。== 只会在某些情况下查看引用,当引用指向内存中的不同位置时,即使字符串的内容相同,也会返回 false。

如果您将堆栈专门用作其他地方的字符串,我会将其保留为字符串,否则简单地使用一堆字符会更干净

Stack<Character> st = new myStack<>();

或者

Stack<char> st = new myStack<>();
于 2013-11-08T17:32:34.417 回答