栈:先进后出
栈是用链表或数组实现先进后出的一个逻辑结构
比如一些栈只能存放整型的数据,如何实现先进后出?
先让游标f指向第一个位置,5
插入完成之后f加加等。
出栈怎么办?比如让4出栈 ,直接f--
f--;
arr[f]
入栈顺序:
arr[f] = 值;
f++;
用代码实现:
对一个栈内存,队列来说,存储形式有两种:顺序性存储(链表),非顺序性存储链式存储
链表、数组、图等都是逻辑结构。
实践就是物理结构(地址连不连续)。
pulic class Stack {
private int[] arr;//定义一个数组来存储数据
private int f = 0;//定义用来存储数据和取出数据的游标
public Stack(int Size){
arr = new int[Size];
}
//添加数据
public void add(int val){
if(f== arr.length) {
System.out.println("这个栈已经满了");
//扩容
int[] brr = new int[arr.length * 2];
for(int i = 0;i < arr.length;i++) {
brr[i] = arr[i];
}
arr = brr;
}
arr[f] = val;
f++;
}
//取出数据
public void get() {
if(f== 0) {
System.out.println("这个栈已经空了");
return;
}
f--;
System.out.println(arr[f]);
}
}
public classs Test{
public static void main(String[] args) {
Stack stack = new Stack(10);
stack.add(5);
stack.add(6);
stack.add(7);
stack.get();
stack.get();
stack.get();
stack.get();
stack.get();
}
}
创建栈内存堆内存
main方法入栈,数组大小为10
调用插入数据的方法,
调用add方法,add方法入栈。arr[f]=val; 把5放进去
f++; 6放入,之后7,
之后6.7
调用get,get入栈
f--,把7输出,f--,把6输出
add方法
f++,10进去,11进去
通过内部相应的实现方法,就实现了一个栈
在里面写一些if判断,满了之后实现扩容,调用4次get就空了。
链表
队列:先进先出
f++,到这里。
出的话怎么出呢?
再定义一个游标,
r++,当他俩相等了就意味着空了。
实现代码:
public class Quece{
private int[] arr;
private int f =0; //放入
private int r =0; //放出
public Queue(int Size){
arr = new int[Size];
}
//添加数据
public void add(int value){
if(f - r == arr.length){
int[] brr = new int[arr.length *2] ;
for (int i = r;i<f;i++){
brr[i] = arr[i % arr.length];
}
arr = brr;
}
arr[f % arr.length] = value;
f++;
}
//取出数据
public void get(){
if (r == f){
System.out.println("已经没有数据了");
return;
}
System.out.println(arr[r % arr.length]);
r++;
}
}
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Queue queue = new Queue(2);
queue.add(10);
queue.add(9);
queue.add(8);
queue.get();
queue.get();
queue.get();
queue.get();
}
}
f - r = arr.length;//扩容
如果r也移动了,那如何让f继续添加数据,并且当f和r指向统一块内存空间的时候还能扩容。