一、栈的定义和特性:
栈又叫堆栈(stack),是线性的数据结构,是运算受限的线性表,只允许在表的一端插入和删除元素,不允许在其他位置进行操作。
运行操作的一端称为栈顶(top),另一端称为栈底(bottom),栈里没有元素时称为空栈。
特性:
1.是一种后进先出(LIFO)、先进后出(FILO)的数据结构;
2.对栈的基本操作有push(进栈)、pop(出栈)和peek(获取栈顶元素) ,push是插入元素,pop是删除最后插入的元素;
栈的图解:
二、队列的定义和特性:
与栈相反,队列是先进先出(FIFO,First InFirst Out)的数据结构。
队列的基本操作是
入队(enqueue) ,就是在队尾rear 插入一个元素;
出队(dequeue),删除并返回队列头front的元素
队列的图解:
三、java中栈、队列的实现
stack 类(以及过时,不推荐使用);
queue接口,实现类主要有ArrayBlockingQueue(阻塞)、ConcurrentLinkedQueue(非阻塞)
deque 接口,是双端队列,栈操作建议用这个,它的实现类主要有两个实现类ArrayDeque和LinkedList。
四、代码实例
下面写一个自定义的栈MyStack,并测试把一个十进制的数字转换为二进制的。
package com.gaojc.suanfa;
/**
* 自定义的栈MyStack,并测试把一个十进制的数字转换为二进制的
*
* @author gaojc
* @date 2019/7/7 12:03
*/
public class MyStack {
//栈的元素
private Object[] data;
//栈元素数量
private int size;
//栈顶元素位置
private int top;
public MyStack(int size) {
this.data = new Object[size];
this.size = size;
//初始化栈的时候,是一个空栈,栈顶下标为-1
top = -1;
}
//入栈,在栈顶插入元素
public Object push(Object obj) {
return data[++top] = obj;
}
//出栈,删除并返回栈顶元素
public Object pop() {
return data[top--];
}
//获取栈顶元素
public Object peek() {
return data[top];
}
//判断非空
public boolean isEmpty() {
return (top == -1);
}
// 十进制的18转为 --> 二进制的10010
public static void main(String[] args) {
//实现进制转换,把10进制转换为2进制
MyStack myStack = new MyStack(20);
// 拼接数字成一个字符串,用于显示
StringBuilder sb = new StringBuilder();
int number = 18;
int num = number;
while (num > 0) {
//num 除以2的余数是2进制位
myStack.push(num % 2);
//除以2的商作为被除数,继续
num = num / 2;
}
while (!myStack.isEmpty()) {
sb.append(myStack.pop());
}
// 18的二进制 是 10010
System.out.println(sb);
}
}