数据结构——栈与队列总结与java实现

栈的定义: 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
当表中没有元素时称为空栈。
栈为后进先出(Last In First Out)的线性表,简称为LIFO表。
在这里插入图片描述
java代码实现:

public class MyStack {
	//栈的底层使用数组来存储数据
	int[] elements;
	
	public MyStack() {
		elements=new int [0];
	}
	//压入元素
	public void push(int element) {
		//创建一个新数组
		int [] newArr=new int[elements.length+1];
		//把原来数组的元复制到新数组中
		for(int i=0;i<elements.length;i++) {
			newArr[i]=elements[i];
		}
		//把添加的元素放到新数组中
		newArr[elements.length]=element;
		//使新数组替换旧数组
		elements=newArr;
	}
	
	//取出栈顶元素
	public int pop() {
		if(elements.length==0) {
			throw new RuntimeException("stack is null");
		}
		//取出数组的最后一个元素
		 int element=elements[elements.length-1];
		 //创建一个新数组
		 int[] newArr=new int [elements.length-1];
		 //原数组中除了最后一个的其他元素都放入新的数组中
		 for(int i=0;i<elements.length-1;i++) {
			 newArr[i]=elements[i];
		 }
		 //替换数组
		 elements=newArr;
		 //返回栈顶元素
		 return element;
	}
	
	//查看栈顶元素
	public int peek() {
		//栈中没有元素
		if(elements.length==0) {
			throw new RuntimeException("stack is null");
		}
		return elements[elements.length-1];
		
	}
	
	//判断栈是否为空
	public boolean isEmpty() {
		return elements.length==0;	
	}
}
public class testMyStack {
	public static void main(String[] args) {
		//创建一个栈
		MyStack ms=new MyStack();
		//压入数组
		ms.push(9);
		ms.push(8);
		ms.push(7);
		//取出栈顶元素
		System.out.println(ms.pop());
		System.out.println(ms.pop());
		System.out.println(ms.pop());
		//System.out.println(ms.peek());
		System.out.println(ms.isEmpty());
	}

队列

定义:队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表
队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表。
在这里插入图片描述
java代码实现:

public class MyQueue {
	int elements[];
	
	public MyQueue() {
		elements=new int[0];
	}
	
	//入队
	public void add(int element) {
		//创建一个新数组
				int [] newArr=new int[elements.length+1];
				//把原来数组的元复制到新数组中
				for(int i=0;i<elements.length;i++) {
					newArr[i]=elements[i];
				}
				//把添加的元素放到新数组中
				newArr[elements.length]=element;
				//使新数组替换旧数组
				elements=newArr;
	}
	//出队
	public int  poll() {
		//把数组中的第0个元素取出来
		int element=elements[0];
		//创建一个新的数组
		int[] newArr=new int[elements.length-1];
		//复制原有元素到数组中
		for(int i=0;i<newArr.length;i++) {
			newArr[i]=elements[i+1];
		}
		//替换数组
		elements=newArr;
		return element;
	}
	//判断队列是否为空
	public boolean isEmpty() {
		return elements.length==0;	
	}
}
public class TestMyQueue {
	public static void main(String[]args) {
		//创建一个队列
		MyQueue mq=new MyQueue();
		//入队
		mq.add(9);
		mq.add(8);
		mq.add(7);
		//出队
		System.out.println(mq.poll());
		System.out.println(mq.poll());
		System.out.println(mq.poll());
		System.out.println(mq.isEmpty());
	}

}

栈与队列的异同点

相同点:
都是线性结构,元素之间具有“一对一”的逻辑关系
插入操作都是再表尾进行
都可以使用顺序存储结构或链式存储结构实现
在时间代价上,插入删除操作的时间复杂度都是O(1), 在空间待见上也相同。
不同点
删除操作的位置不同,栈只在表尾操作,队列在表头操作;
栈是后进先出(LIFO),队列是先进先出(FIFO),
应用场景不同,顺序栈可以多栈空间共享,而顺序队列不同

发布了22 篇原创文章 · 获赞 4 · 访问量 1528

猜你喜欢

转载自blog.csdn.net/qq_42711899/article/details/104296740