数据结构的数组已经简单的说了,本来中间应该是链表的,但是还是决定先说栈的知识,先将一整套的流程理一遍,然后在切换到链表上。
数据结构其实可以分为物理结构和逻辑结构,像数组由于是在内存中连续存储的,所以支持下标访问,这就是物理结构,因为该特性是由自身的物理存储方式而带来的。
那么逻辑结构就大相径庭了,它是依靠逻辑关系来控制的结构。固然任何数据都需要存储和分布,我举一个简单的例子你就会理解。
现在仅有一个简单的数组,访问哪个元素就是哪个值,这就是一个普通的物理结构
现在我变了一下,每次访问下标为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