当前位置:实例文章 » 其他实例» [文章]王道考研数据结构--5.顺序栈

王道考研数据结构--5.顺序栈

发布人:shili8 发布时间:2025-02-21 22:50 阅读次数:0

**顺序栈**

顺序栈是一种线性表的抽象数据类型,它遵循先进先出(LIFO)的原则。也就是说,最后添加的元素将首先被移除。

###5.1 顺序栈的定义和基本操作**定义**

顺序栈是由一组元素组成的线性表,每个元素都有一个索引值(即其在栈中的位置),栈顶元素的索引值最大。栈底元素的索引值最小。

**基本操作**

1. **push(x)**:将元素x压入栈顶。
2. **pop()**:从栈顶弹出一个元素,返回该元素的值。如果栈为空,则抛出异常。
3. **peek()**:返回栈顶元素的值,但不移除该元素。若栈为空,则抛出异常。

###5.2 顺序栈的实现####5.2.1 使用数组实现顺序栈

javapublic class ArrayStack {
 private int[] elements;
 private int top;

 public ArrayStack(int capacity) {
 this.elements = new int[capacity];
 this.top = -1;
 }

 public void push(int x) {
 if (top == elements.length -1) {
 // 栈满了,需要扩容 int[] newElements = new int[elements.length *2];
 System.arraycopy(elements,0, newElements,0, elements.length);
 elements = newElements;
 }
 top++;
 elements[top] = x;
 }

 public int pop() {
 if (top == -1) {
 // 栈空了,抛出异常 throw new RuntimeException("Stack is empty");
 }
 int x = elements[top];
 elements[top--] =0; // 将栈顶元素置为0,以便GC回收 return x;
 }

 public int peek() {
 if (top == -1) {
 // 栈空了,抛出异常 throw new RuntimeException("Stack is empty");
 }
 return elements[top];
 }
}


####5.2.2 使用链表实现顺序栈
javapublic class Node {
 int data;
 Node next;

 public Node(int data) {
 this.data = data;
 this.next = null;
 }
}

public class LinkedListStack {
 private Node top;

 public void push(int x) {
 Node node = new Node(x);
 if (top == null) {
 top = node;
 } else {
 node.next = top;
 top = node;
 }
 }

 public int pop() {
 if (top == null) {
 throw new RuntimeException("Stack is empty");
 }
 int x = top.data;
 top = top.next;
 return x;
 }

 public int peek() {
 if (top == null) {
 throw new RuntimeException("Stack is empty");
 }
 return top.data;
 }
}


###5.3 使用顺序栈的例子####5.3.1 使用顺序栈实现括号匹配
javapublic class BracketMatcher {
 public boolean match(String s) {
 ArrayStack stack = new ArrayStack(s.length());
 for (int i =0; i < s.length(); i++) {
 char c = s.charAt(i);
 if (c == '(' || c == '[' || c == '{') {
 stack.push(c);
 } else if (c == ')' || c == ']' || c == '}') {
 if (stack.isEmpty()) {
 return false;
 }
 char top = stack.pop();
 if ((c == ')' && top != '(') ||
 (c == ']' && top != '[') ||
 (c == '}' && top != '{')) {
 return false;
 }
 }
 }
 return stack.isEmpty();
 }
}


####5.3.2 使用顺序栈实现表达式求值
javapublic class Calculator {
 public int evaluate(String s) {
 ArrayStack stack = new ArrayStack(s.length());
 for (int i =0; i < s.length(); i++) {
 char c = s.charAt(i);
 if (c == ' ') {
 continue;
 } else if (c >= '0' && c <= '9') {
 int num = c - '0';
 while (i +1 < s.length() && s.charAt(i +1) >= '0' && s.charAt(i +1) <= '9') {
 i++;
 num = num *10 + (s.charAt(i) - '0');
 }
 stack.push(num);
 } else if (c == '+' || c == '-' || c == '*' || c == '/') {
 int right = stack.pop();
 int left = stack.pop();
 switch (c) {
 case '+':
 stack.push(left + right);
 break;
 case '-':
 stack.push(left - right);
 break;
 case '*':
 stack.push(left * right);
 break;
 case '/':
 if (right ==0) {
 throw new RuntimeException("Division by zero");
 }
 stack.push(left / right);
 break;
 }
 } else {
 throw new RuntimeException("Invalid character");
 }
 }
 return stack.pop();
 }
}


###5.4 总结顺序栈是一种线性表的抽象数据类型,它遵循先进先出(LIFO)的原则。使用顺序栈可以实现括号匹配、表达式求值等功能。通过使用数组或链表来实现顺序栈,可以有效地管理栈中的元素,提高程序的效率和可读性。

相关标签:
其他信息

其他资源

Top