21xrx.com
2024-12-23 07:19:36 Monday
登录
文章检索 我的文章 写文章
作为一名Java开发者
2023-06-12 13:40:04 深夜i     --     --

作为一名Java开发者,我经常使用栈这种数据结构来帮助我完成不同的任务。根据我的经验,栈可以轻松地存储和管理数据,而且非常容易使用。下面是一些Java实用栈的例子,以帮助你更好地理解如何使用这种数据结构来加速你的开发。

首先,让我们看一下如何实现基本的栈。以下是一个Java类,它实现了一个栈的基本操作,如push,pop和isEmpty:


public class Stack {

  private LinkedList list = new LinkedList ();

  public void push(T data) {

    list.addFirst(data);

  }

  

  public T pop() {

    if (isEmpty()) {

      throw new RuntimeException("Stack is empty");

    }

    return list.removeFirst();

  }

  

  public T peek() {

    if (isEmpty()) {

      throw new RuntimeException("Stack is empty");

    }

    return list.getFirst();

  }

  

  public boolean isEmpty() {

    return list.isEmpty();

  }

  

  public int size() {

    return list.size();

  }

}

在此类中,我们使用了Java的LinkedList来实现真正的堆栈操作。其中,push()方法将一个新的项添加到堆栈顶部,pop()方法将当前项从堆栈顶部弹出,peek()方法返回关联堆栈顶部的当前项,isEmpty()方法检查堆栈是否为空,size()方法返回堆栈的大小。

接下来,让我们看一个例子,展示如何使用我们刚刚实现的栈类。假设我们需要编写一个Java程序来检查一个字符串中的所有括号是否匹配。为了完成这个任务,我们需要使用栈来跟踪我们遇到的左括号,直到找到匹配的右括号。以下是检查括号匹配的Java代码:


public boolean checkBracketMatching(String str) {

  Stack stack = new Stack ();

  for (char c : str.toCharArray()) {

    switch (c) {

      case '(':

      case '[':

      case '{':

        stack.push(c);

        break;

      case ')':

        if (stack.isEmpty() || stack.pop() != '(')

          return false;

        

        break;

      case ']':

        if (stack.isEmpty() || stack.pop() != '[')

          return false;

        

        break;

      case '}':

        if (stack.isEmpty() || stack.pop() != '{')

          return false;

        

        break;

    }

  }

  return stack.isEmpty();

}

在这个例子中,我们遍历输入字符串中的每个字符,并使用switch语句在遇到左括号时将其推入栈中,直到遇到右括号时弹出栈顶元素并检查相应的左括号是否匹配。如果栈顶元素与右括号不匹配或栈为空,则返回false。最后,如果栈为空,则表示所有括号都正确匹配,返回true。

最后,让我们看另一个例子,展示如何使用栈来实现一个逆波兰计算器。以下是一个Java类,它实现了一个逆波兰计算器:


public class RPNCalculator {

  private Stack stack = new Stack ();

  public void push(double num) {

    stack.push(num);

  }

  public double pop() {

    return stack.pop();

  }

  public double calculate(String expression) {

    for (String token : expression.split(" ")) {

      if (isOperator(token)) {

        double y = pop();

        double x = pop();

        double result = evaluate(x, y, token);

        push(result);

      } else {

        push(Double.parseDouble(token));

      }

    }

    return pop();

  }

  private boolean isOperator(String token) {

    return "+-*/".contains(token);

  }

  private double evaluate(double x, double y, String operator) {

    switch (operator) {

      case "+":

        return x + y;

      case "-":

        return x - y;

      case "*":

        return x * y;

      case "/":

        return x / y;

      default:

        throw new IllegalArgumentException("Invalid operator: " + operator);

    }

  }

}

在这个例子中,我们定义了一个逆波兰计算器,它使用栈来存储表达式的值。在calculate()方法中,我们遍历输入的表达式,并使用isOperator()方法来检查当前token是否是运算符。如果当前token是运算符,则使用pop()方法从栈中弹出两个值,并使用evaluate()方法计算这两个值的结果,并使用push()方法将结果推入栈中。如果当前token是数字,则使用push()方法将其推入栈中。最后,我们从栈中弹出最终结果并返回它。

综上所述,栈是Java编程中非常实用的数据结构之一。无论是用于括号匹配、逆波兰计算器还是其他任务,栈都可以使你的开发工作更加高效和方便。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复