数据结构与算法-栈

  • Post author:
  • Post category:其他


数据结构的数组已经简单的说了,本来中间应该是链表的,但是还是决定先说栈的知识,先将一整套的流程理一遍,然后在切换到链表上。

数据结构其实可以分为物理结构和逻辑结构,像数组由于是在内存中连续存储的,所以支持下标访问,这就是物理结构,因为该特性是由自身的物理存储方式而带来的。

那么逻辑结构就大相径庭了,它是依靠逻辑关系来控制的结构。固然任何数据都需要存储和分布,我举一个简单的例子你就会理解。

现在仅有一个简单的数组,访问哪个元素就是哪个值,这就是一个普通的物理结构

现在我变了一下,每次访问下标为i的元素,返回i及其之前所有元素的和

固然该奇怪的功能是以数组作为支撑,但是它的功能是依靠逻辑和算法实现的,这就是逻辑结构(该例子不是特别恰当,但是理起来就比较容易)

想象一下,生活中常见的例子,比如装羽毛球的桶

其中的球是如何装和取的-》先装进去的球后取出来,后装进去的球先取出来(这就是栈的逻辑)

栈也是一个线性的结构,占据连续区域,它由栈顶和栈底之说,每次入栈和出栈都是从栈顶进行

可能有人会说,这个就是一个顺序的问题,有什么用处?

哈哈,刚开始我也是这样,先不说计算机中堆栈的作用如何之大,我们仅举一下生活中的例子。

1. 表达式的括号检查,例如编程的语法等等

{1+(2+[3+4])+(5+6)}   我们知道括号必须是一对一对的,并且是相互匹配,我们检查这个表达式匹配情况

肉眼一看是正确的,那么计算机会如何匹配呢?


我们先将左括号都入栈,当遇到右括号之后就从栈中取出看看是不是匹配

多次入栈和出栈比较之后,语句结束时无错误,并且栈是空的,那么表达式的括号是匹配的。

2.进制转换,比如10进制转8进制,我们通常算数是这样的


最后得到的结果是142,跟我们一步一步除法的结果是反过来的,此时正好是栈发挥的地方。

好了,既然基本的原理说完了,那么就谈谈实现吧。既然学过数组。那么我们就用数组来实现。

首先是需要注意的地方:

1. 我们需要有栈底和栈顶,可以用来判断是否为空。

2. 栈有入栈和出栈功能,用来压入和弹出元素(压入 弹出就是入栈出栈的意思)。

那么我们的数组模型大概就是

我们屏蔽下标访问,并且增加push入栈 和pop弹出方法,需要判断是否为空

实际代码:(实际例子就使用java写了,比较通用的写法,其他程序也差不多,推荐的在线网站

https://tool.lu/coderunner/

)


class learn {
	public static void main(String []args)
	{
		stack st = new stack();  //创建新的栈
 		st.pop();  //弹出测试
		st.push(6);  //入栈
		int res = st.pop();  //出栈
		System.out.println(res);
	}
}
	
class stack
{
	int[] array; //数组
	int bottom;   //栈底
	int top; //栈顶
	
	stack()
	{
		array = new int[10];
		bottom = -1;
		top = 0;		
	}
	
 	public void push(int item)  //入栈  抬高栈顶
 	{
 		array[top]=item;
 		top+=1;
 	}
	
 	public int pop()    //出栈 降低栈顶
 	{
 		if(top-1>bottom)
 		{
 			top-=1;
 			return array[top];
 		}
 		else
 		{
 		    System.out.println("当前栈为空");
 			return -1;
 		}
 	}
}
# 输出

0
当前栈为空
6



版权声明:本文为iamsongyu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。