一、概述
栈(stack):是线性表的一种,限制仅在线性表的一端进行插入和删除操作。其中允许插入和删除的一端称为栈顶(top),不允许插入和删除的一端称为栈底(bottom)。
二、 顺序存储栈的基本操作以及算法实现
基本操作:初始化、判断是否为空、求栈深、读取栈顶元素、出栈/入栈、栈置空等。
抽象出栈的基本操作:
先声明一个接口
package com.zhouyou.stack;
public interface MyStack<Item> {
MyStack<Item> push(Item item); //入栈
Item pop(); //出栈
int size(); // 大小
boolean isEmpty();
}
定义栈数据结构
package com.zhouyou.stack;
public class ArrayStack<Item> implements MyStack<Item> {
// 设置大小
private Item[] a = (Item[]) new Object[1];
private int n = 0; //大小 初始的元素个数 扩容很慢,最好开始就设置
public ArrayStack(int cap){
a = (Item[])new Object[cap];
}
@Override
public MyStack push(Item item) {
// 判断是否扩容
if (n >= a.length){
resize(2 * a.length);
}else if(n > 0 && n <= a.length /2){ // 自定义缩小内存容量
resize(a.length / 2);
}
a[n++] = item;
return null;
}
// 数组扩容
private void resize(int size){
Item[] items = (Item[]) new Object[size];
for (int i = 0; i < n; i++) {
items[i] = a[i];
}
a = items;
}
@Override
public Item pop() {
Item item = a[--n]; // 先运算求n值在 赋值
a[n] = null; // 这一步是 把内存赋空
return item;
}
@Override
public int size() {
return n;
}
@Override
public boolean isEmpty() {
return n == 0 ;
}
}
练习题 ->利用栈的特性进行 括号等符号进行判断检测
package com.zhouyou.stack;
import java.util.Scanner;
public class KuoHaoStack {
public static boolean isOk(String s){
//s表示的就是待匹配的括号串 [}使用字符来表示 时间复杂度 O(n) 判断是否匹配
MyStack<Character> brackets = new ArrayStack<>(20);
char[] chars = s.toCharArray();
Character top;
for (char x : chars) {
switch (x){
case '{':
case '[':
case '(':
case '(':
brackets.push(x);
break;
case '}':
top = brackets.pop();
if (top == null) return false;
if (top == '{'){
break;
}else {
return false;
}
case ']':
top = brackets.pop();
if (top == null) return false;
if (top == '['){
break;
}else {
return false;
}
case ')':
top = brackets.pop();
if (top == null) return false;
if (top == '('){
break;
}else {
return false;
}
default:
break;
}
}
return brackets.isEmpty();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()){
String next = scanner.next();
System.out.println("s的匹配结果:"+isOk(next));
}
}
}
栈结构很有意思,很有学习的必要,特此记录,随时巩固