数据结构与算法-基础数据结构:栈结构学习与练习

一、概述
栈(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));
        }
    }
}

栈结构很有意思,很有学习的必要,特此记录,随时巩固

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值