当前位置: 首页 > 知识库问答 >
问题:

使用2个通用堆栈验证表达式

尹承业
2023-03-14

任务是实现一个通用堆栈(不能使用java中的库),使用true和false为布尔b1和b2输入表达式,逻辑运算符(and,or,not,iff,implies)识别其布尔or运算符并发送到2个堆栈,然后弹出堆栈以评估其是否为有效表达式,即:输入:(b1和b2)意味着b3是一个有效的表达式,但b3和(b2 or)不是,我对堆栈部分有问题,因为peek没有返回任何元素,这是我到目前为止的代码,注意:字符是因为我要检查括号是否平衡:

public class MyStack<T> {

    class StackOverFlowException extends RuntimeException{}
    class EmptyStackException extends RuntimeException{}
    
    private T[] stack;
    private int top;
    
    public MyStack(int size) {
        this.stack = (T[]) new Object[size];
        this.top = 0;   
        
    }
    
    public boolean isEmpty() {
        return this.top == 0;
    }
    
    public boolean isFull() {
        return this.top == stack.length;
    }
    
    public void push(T x) {
        if(top == stack.length) {
            throw new StackOverFlowException();
        }
        else {
            this.stack[top] = x;
            top++;
        }
    }
    
    public T pop() {
        if(isEmpty()) {
            throw new EmptyStackException();
        }
        else {
            T value = this.stack[--top];
            return value;
        }
    }
    
    public T peek() {
        return this.stack[top];
    }
    
    public static void main(String[] args) {
        MyStack<String> tf = new MyStack(100);
        MyStack<String> operators = new MyStack(100);
        
        System.out.println("Please input the expression to evaluate: ");
        Scanner scn = new Scanner(System.in);   
        String expression = scn.nextLine();
        String tokens[] = expression.split(" ");
        int n = tokens.length;
        boolean P1 = true;
        boolean P2 = true;
        boolean result = true;
        
        for(int i = 0; i < n; i++ ) {
        
            String separate = tokens[i];
            char x = separate.charAt(i);
            if(tokens[i].equalsIgnoreCase("true")||tokens[i].equalsIgnoreCase("false")) {
                tf.push(separate);
                tf.peek();

            }
            else if(tokens[i].equalsIgnoreCase("and")||tokens[i].equalsIgnoreCase("not")||tokens[i].equalsIgnoreCase("or")||tokens[i].equalsIgnoreCase("implies")||tokens[i].equalsIgnoreCase("iff")) {
                operators.push(separate);
            }
            
            else {
                System.out.println("Expression not Valid!");
            }
            
        }
        
        
        
        
        
        
    
    }

共有1个答案

戚森
2023-03-14

在peek()方法(以及isEmpty()方法)中,top变量被误解。

在实现时,top是一个误称,因为它实际上是堆栈的大小(也可能被视为下一个要推送的元素的索引)。因此,您的peek()方法应该查看顶部之前的元素。

或者,您可以将顶部定义为堆栈顶部的元素,因为这通常是您在其他地方使用它的方式。在这种情况下,您需要定义一个标志值来指示堆栈为空。

在任何情况下,都需要在方法中处理空堆栈的情况。

public class MyStack {
  private static final int EMPTY = -1;
  private int top = EMPTY;

  ... other stuff ...

  public boolean isEmpty() {
    return EMPTY == top;
  }
  public T peek() {
    if (ifEmpty()) {
       throw new EmptyStackException("Cannot peek into empty Stack");
    }
    return stack[top];
  }
}

 类似资料:
  • 我正在为我的一堂计算机科学课开发一个计算后缀表达式结果的程序。该程序使用堆栈ADT来实现这一点。 我已经编写了程序,但相信可能会有错误,因为一些表达式的结果不正确。我不确定我的错误在哪里。 此外,当输入文件为空时,程序将生成一个值32767。那是从哪里来的? 表达式:34+3*值=21。 主程序:

  • 2. 堆栈 在第 3 节 “递归”中我们已经对堆栈这种数据结构有了初步认识。堆栈是一组元素的集合,类似于数组,不同之处在于,数组可以按下标随机访问,这次访问a[5]下次可以访问a[1],但是堆栈的访问规则被限制为Push和Pop两种操作,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则取出当前栈顶的元素,也就是说,只能访问栈顶元素而不能访问栈中其它元素。如果所有元素的类型相同,堆栈的存

  • 问题内容: 使用Java中的链表实现堆栈的最佳方法是什么? 编辑:我将最好的定义为最有效的使用干净的代码。我已经使用数组来实现堆栈,但是对链接列表不熟悉,因此想知道是否有人可以帮助我实现类似于以下内容的内容: 编辑:如果有人感兴趣,这是链表的实现。 问题答案: 假设您真的想从头开始,而不是使用现有的完美堆栈实现之一,那么我建议您: 创建一个“ MyStack ”类,该类实现所需的任何接口(也许列出

  • 我得到了一个包含运算符、、*、和括号的算术公式(这可能会改变运算符的自然优先级,也可能不会改变)。例如:a/b f–(c d)*e–a*c。我被要求使用堆栈(实现为链表)来跟踪操作数和运算符:我的程序应该如何工作的示例如下: 读取、推送操作数堆栈 读取/推送运算符堆栈 读取b,推送操作数堆栈 Read:的优先级低于/,因此: 从操作数堆栈中弹出2个操作数(a和b) 弹出/来自运算符堆栈 创建子树并

  • 我需要检查密码是否至少包含: 一个号码 一个小写字符 一个大写字符 一个特殊符号(.,@etc) 我在C#中有以下内容: 但这并不有效: 我错过了什么? 更新 我正在将其与系统.组件模型.数据注释一起使用来验证模型属性:

  • 我在Java中使用2个堆栈实现了一个队列,我遵循以下算法: 排队(x) 将x推到堆栈1 deQueue() 1)如果两个堆栈都为空,则返回错误 2)如果stack2为空,而stack1不为空,则将所有内容从stack1推到stack2 3)从stack2弹出元素并返回它。 现在,这里的问题是第一个操作非常慢(因为它将所有内容传输到)。我们可以修改算法,使总是O(1)吗?还有其他选择吗?