数据结构——栈和队列


前言

线性结构是最简单、最常用的数据结构之一。线性结构的特点是:在数据元素的有限集中,除第一个元素无直接前驱,最后一个元素无直接后续外,每个元素有且仅有一个直接前驱和一个直接后继元素

从逻辑结构上来说,栈和队列是线性结构,但是与线性表不同的是它们所支持的基本操作是受到限制的。


栈和队列

栈又称堆栈,其限制是仅允许在表的一端(栈顶)进行插入和删除操作,不允许在其他位置进行插入、删除等操作,所以后进栈的元素必定先出栈(后进先出)。

栈的基本操作

  • getSize():返回堆栈的大小,即数据元素的个数
  • isEmpty():判断堆栈是否为空
  • push(e):元素入栈
  • pop():栈顶元素出栈,并返回
  • peek():获取栈顶元素,但不出栈

队列,其限制是仅允许在表的一端(队尾rear)进行插入,而在表的另一端(队首front)删除,所以先进队的必然先离队(先进先出)。新元素入队后成为队尾元素,从队列中删除元素后,其后续元素成为新的队首元素。

队列的基本操作

  • getSize():返回队列的大小,即数据元素的个数
  • isEmpty():判断队列是否为空
  • enqueue(e):元素入队
  • dequeue():栈顶元素出队,并返回
  • peek():获取队首元素,但不出队列

堆栈的应用

进制转换

public void baseConversion(int num,int target) {
		Stack<Integer> s = new Stack<Integer>();
		while(num>0) {
			s.push(num%target);
			num = num/target;
		}
		while(!s.isEmpty()) System.out.println(s.pop());
	}

括号匹配检测

假设表达式中包括三种符号:圆括号、方括号和花括号,并且它们可以任意相互嵌套,例如{{}}、[{()}]等为正确格式,而{[()])或({])为不正确的格式。

public static boolean bracketMatch(String str) {
		Stack<Character> st = new Stack<Character>();
		for(int i=0;i<str.length();i++) {
			char c= str.charAt(i);
			//如果是左括号,则直接入栈,等待相匹配的同类右括号。
			switch(c)
			{
			case '{':
			case '[':
			case '(': st.push(c);break;
			//如果是右括号,而堆栈为空,说明没有括号匹配,属于非法情况;
			case '}':
				if(!st.isEmpty() && st.pop().charValue()=='{')
					break;
				else return false;
			case ')':
				if(!st.isEmpty() && st.pop().charValue()=='(')
					break;
				else return false;
			case ']':
				if(!st.isEmpty() && st.pop().charValue()=='[')
					break;
				else return false;
			}
			
		}
		//一直到字符读完,而堆栈不为空,则说明左括号没有得到匹配,属于非法情况
		if(st.isEmpty()) return true;
		else return false;
	}

参考

数据结构与算法(JAVA语言版)——周鹏
如有侵权,请联系作者更正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值