括号匹配的代码没有实现。(未实现的代码在最下面)
一、功能描述
当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a。当你后退到页面 a,点击前进按钮,就可以重新查看页面 b 和 c。但是,如果你后退到页面 b 后,点击了新的页面 d,那就无法再通过前进、后退功能查看页面 c 了。
二、如何理解“栈”?
关于“栈”,我有一个非常贴切的例子,就是一摞叠在一起的盘子。我们平时放盘子的时候,都是从下往上一个一个放;取的时候,我们也是从上往下一个一个地依次取,不能从中间任意抽出。后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性上来看,栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。
三、如何实现一个“栈”?
可以通过数组或链表都可以实现栈。
用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。
3.1、实现一个基于数组的顺序栈
// 基于数组实现的顺序栈
public class ArrayStack {
private String[] items; // 数组
private int count; // 栈中元素个数
private int n; //栈的大小
// 初始化数组,申请一个大小为n的数组空间
public ArrayStack(int n) {
this.items = new String[n];
this.n = n;
this.count = 0;
}
// 入栈操作
public boolean push(String item) {
// 数组空间不够了,直接返回false,入栈失败。
if (count == n) return false;
// 将item放到下标为count的位置,并且count加一
items[count] = item;
++count;
return true;
}
// 出栈操作
public String pop() {
// 栈为空,则直接返回null
if (count == 0) return null;
// 返回下标为count-1的数组元素,并且栈中元素个数count减一
String tmp = items[count-1];
--count;
return tmp;
}
}
自己实现方式:
public class StackTest {
public static void main(String[] args) {
StackTest stackTest = new StackTest(5);
boolean a = stackTest.insert("a");
boolean b = stackTest.insert("b");
boolean c = stackTest.insert("c");
System.out.println(stackTest);
String pop = stackTest.pop();
String pop1 = stackTest.pop();
String pop2 = stackTest.pop();
System.out.println(pop2);
}
String[] arr;
int count = 0; //元素的个数
int n; //总个数
public StackTest(int n) {
arr = new String[n];
this.n = n;
}
//进栈操作
public boolean