数据结构-栈

栈作为一种后进先出的抽象数据类型,相对于数组而言访问其元素更加受限,这体现在数组只需要知道某个元素下标即可直接访问,或者遍历获取所有元素;而栈只允许访问一个数据项,即每次只能访问栈顶的元素,移除栈顶元素后,才能访问倒数第二个元素。

代码实现

我们可以用java代码模拟栈结构

/**
 * 栈
 * @author sunyan
 *
 */
public class Stack {
	private int[] stackArray;
	private int maxSize;//最大容积
	private int top;//下标
	
	public Stack(int size){
		this.maxSize = size;
		this.stackArray = new int[maxSize];
		this.top = -1;
	}
	
	/**
	 * 入栈
	 * @param x
	 */
	public void push(int x){
		stackArray[++top] = x;
	}
	
	/**
	 * 出栈
	 * @return
	 */
	public int pop(){
		return stackArray[top--];
	}
	
	/**
	 * 栈顶元素
	 * @return
	 */
	public int peek(){
		return stackArray[top];
	}
	
	/**
	 * 栈是否为空
	 * @return
	 */
	public boolean isEmpty(){
		return (top == -1);
	}
	
	/**
	 * 栈是否已满
	 * @return
	 */
	public boolean isFull(){
		return (top == maxSize);
	}
}

这里实现了栈的几个基本功能,然后我们向栈中加入几个元素来模拟出栈

public class StackTest {
	public static void main(String[] args){
		Stack stack = new Stack(5);
		stack.push(0);
		stack.push(1);
		stack.push(2);
		stack.push(3);
		stack.push(4);
		while(!stack.isEmpty()){
			System.out.print(stack.pop());
		}
	}
}

输出结果:
在这里插入图片描述
可以看到,后插入的元素先输出。

栈的应用场景之一

利用栈实现字符串的逆序
public class Stack {
	private char[] chars;
	private int maxSize;
	private int top;
	
	public Stack(int size){
		this.maxSize = size;
		this.chars = new char[maxSize];
		this.top = -1;
	}
	
	public void push(char c){
		chars[++top] = c;
	}
	
	public char pop(){
		return chars[top--];
	}
	
	public boolean isEmpty(){
		return (top == -1);
	}
}

/**
 * 利用栈实现字符串逆序
 * @author sunyan
 *
 */
public class ReverseWordsTest {
	public static void main(String[] args){
		String str = "abcde";
		char[] chars = str.toCharArray();
		
		Stack stack = new Stack(5);
		for(char c : chars){
			stack.push(c);
		}
		
		while(!stack.isEmpty()){
			System.out.print(stack.pop());
		}
	}
}

输出结果为:
在这里插入图片描述

栈的应用场景之二

分隔符匹配检查
public class Stack {
	private char[] chars;
	private int maxSize;
	private int top;
	
	public Stack(int size){
		this.maxSize = size;
		this.chars = new char[maxSize];
		this.top = -1;
	}
	
	public void push(char c){
		chars[++top] = c;
	}
	
	public char pop(){
		return chars[top--];
	}
	
	public boolean isEmpty(){
		return (top == -1);
	}
}

/**
 * 利用栈检查 分隔符是否匹配
 * 比如 {1[2]3} : 匹配
 *     「a」{]  :不匹配
 * 
 * 分析:分隔符分为 左分隔符、右分隔符. 左右分隔符必须相互匹配。且后出现的左分隔符对应先出现的右分隔符,如1 中的[对应先出现的有分隔符].
 *      因此可以将左分隔符入栈,当出现有分隔符时 做出栈操作,看是否与出栈的分隔符匹配。
 * @author sunyan
 *
 */
public class BracketsTest {
	public static void main(String[] args){
		
		String str = "{{ab}[(cd)e]";
		char[] charArray = str.toCharArray();
		Stack stack = new Stack(str.length());
		for(int i = 0; i < charArray.length; i++){
			char ch = charArray[i];
			switch (ch){
			case '{':
			case '[':
			case '(':
				stack.push(ch);
				break;
			case '}':
			case ']':
			case ')':
				if(!stack.isEmpty()){
					if(ch=='}'&&stack.pop()!='{' || (ch==']'&&stack.pop() != '[') || (ch==')'&&stack.pop()!='(')){
						System.out.println("左右分隔符不匹配");
					}
				}else{
					System.out.println("没有左分割字符与之匹配");
				}
				break;
			default:
					break;
			}
		}
		if(!stack.isEmpty()){
			System.out.println("没有右分割字符与之匹配");
		}
	}
}

输出结果为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fastsy

打赏一份隆江猪脚饭吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值