数据结构之栈及其应用

1.栈的构建

  • 栈的思想是先进后出,后进先出的模式,类似向容器加东西和向容器取东西
  • 栈的底层实现有两种:栈基于链表的实现和基于数组的实现,它们的性能对比如下:
    - 从逻辑结构角度来看
       a、数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,
       可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
       b、链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、
       删除数据项。(数组中插入、删除数据项时,需要移动其它数据项)
    - 从内存存储角度来看
       a、(静态)数组从栈中分配空间, 对于程序员方便快速,但自由度小。
       b、 链表从堆中分配空间, 自由度大但申请管理比较麻烦.
    在这里插入图片描述
    1.1基于数组的栈构建,主要由栈顶指针来控制
			package Stack;
			
			public class Stackdefine {
			 public static void main(String[] args) {
				
			}
			}
			//数组定义栈
			class ArrayStack{
				private int maxSize; //定义大小
				private int top=-1;    //定义栈顶
				private int[] Stacks; //定义栈
				
				public ArrayStack(int maxSize){
					this.maxSize = maxSize;
					Stacks = new int[this.maxSize];
				}
				
				//定义栈满
				public boolean isFull() {
					return maxSize-1==top;
				}
				//定义空栈
				public boolean isEmpty() {
					return top==-1;
				}
				//入栈
				public void addSk(int item) {
					if(isFull()) {
						System.out.println("栈满了");
						return;
					}
					top++;
					Stacks[top] = item;	
				}
				//出栈,返回数据
				public int popSk() {
					if(isEmpty()) {
						throw new RuntimeException("栈为空"); 
					}
					int item =Stacks[top];
					top--;
					return item;
				}
				//遍历栈,从栈顶开始
				public void show() {
					if(isEmpty()) {
						System.out.println("栈为空");
						return;
					}
					for(int i =top;i>-1;i--) {
						System.out.printf("Stacks[%d] =%d\n",i,Stacks[i]);
					}
				}
			}
**测试,在main方法中测试各种方法**
			ArrayStack stack = new ArrayStack(5);
				 stack.addSk(5);//添加数据5-4-3-2-1
				 stack.addSk(4);
				 stack.addSk(3);
				 stack.addSk(2);
				 stack.addSk(1);
				 stack.isFull(); //判断是否满了
				 stack.show(); // 显示数据
				 System.out.println();
				 int item=stack.popSk();
				 System.out.println(item+"  ");
				 stack.isEmpty(); //判断是否为空

测试结果符合栈的特点:
在这里插入图片描述

  • 栈(Stack)作为一种先进后出的数据结构,在符号检测,计算的后缀表达式等应用非常方便。

1.栈的API
- Stack类通过继承了Vector类,可以创建实例对象来调用方法,从而扩展应用了下面五个方法: Object push(Object
element):将元素推送到堆栈顶部。 Object
pop():移除并返回堆栈的顶部元素。如果我们在调用堆栈为空时调用pop,则抛出’EmptyStackException’异常。
Object peek():返回堆栈顶部的元素,但不删除它。 boolean
empty():如果堆栈顶部没有任何内容,则返回true。否则,返回false。 int search(Object
element):确定对象是否存在于堆栈中。它将从堆栈顶部返回元素的位置。否则,它返回-1

  • 2.栈的应用:
    - 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
    - 有效字符串需满足:
    - 左括号必须用相同类型的右括号闭合。
    - 左括号必须以正确的顺序闭合。
    - 注意空字符串可被认为是有效字符串。
    在这里插入图片描述 在这里插入图片描述
			     import java.util.Stack;
			     public boolean isValid(String s) {
			        //考虑边界条件
			      if(s.length()%2==1){return false;}
			      Stack<Character> st = new Stack<Character>();
			      char []c  = s.toCharArray(); //字符串转字符数组
			      for(char item:c){
			          if(item=='('||item=='['||item=='{'){
			              st.push(item);
			          }else{
			              if(st.isEmpty()){return false;}
			              if(item==')'&& st.pop()!='('){
			                  return false;
			              }
			               if(item==']'&& st.pop()!='['){
			                  return false;
			              }
			                 if(item=='}'&& st.pop()!='{'){
			                  return false;
			              }
			          }
			        
			       }
			       return st.isEmpty();   //为空则全部匹配,否则多出来右括号
			    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值