栈的定义:
所有的插入和删除操作都限制在线性表的同一端进行,是一种后进先出的线性表。
表尾端称栈顶,表头端称栈底。
栈的基本运算
initstack():初始化栈
push():元素入栈
pop():栈顶元素出栈
gettop();取栈顶元素
stackempty():判断是否为空
栈的分类
由于栈是一种线性表,则可将栈分为顺序栈和链式栈
①顺序栈可借助数组进行建立,在建立初边分配好了空间,所以在每次入栈的时候,都必
须根据栈顶和栈底的差来判断是否栈满。
②链式栈是一种单向链表,表头即是栈顶指针,每次添加元素时,便是在栈顶指针和第一个
数据之间进行添加。由于链式存储动态分配内存的原因,理论上栈长可以非常大,因此可
不用判断栈满,若有这一需求,可在节点数据域添加长度变量进行判断。
栈的简单使用(数制转换)
此处以链式栈为例:
①定义节点
class NumStackNode{
private String num;
private NumStackNode nextNode;
//相应get、set方法
}
②定义栈结构及相关函数
class LinkStack{
private NumStackNode headNode;
//初始化
public void initStack() {
this.headNode = new NumStackNode();
this.headNode.setNextNode(null);
}
//入栈
public void push(String num) {
NumStackNode addNode = new NumStackNode();
addNode.setNum(num);
//调整结构
addNode.setNextNode(this.headNode.getNextNode());
this.headNode.setNextNode(addNode);
}
//出栈
public String pop() {
//取出数据
String num = this.headNode.getNextNode().getNum();
//调整结构
this.headNode.setNextNode(headNode.getNextNode().getNextNode());
return num;
}
//判断是否栈空
public boolean stackEmpty() {
if(this.headNode.getNextNode() == null) {
return true;
}else {
return false;
}
}
}
③转换函数
/**
* 根据输入的十进制数和要转换的进制,进行进制转换
* @param number 十进制数
* @param scacle 进制
* @return 进制转换后的出的数
*/
public static String realizeShift(int number,int scacle) {
LinkStack lStack = new LinkStack();
lStack.initStack(); //初始化
//运算、压栈
while(number != 0) {
lStack.push(typeShift(number%scacle));
number = number/scacle;
}
//出栈
StringBuilder result = new StringBuilder();
result.append("(");
while(!lStack.stackEmpty()) {
result.append(lStack.pop());
}
result.append(")"+scacle);
return result.toString();
}
/**
* 根据输入的数值进行类型转换,并将大于10的数转为A、B...F
* @param num 输入数值
* @return 转换后的数值
*/
public static String typeShift(int num) {}
④测试结果
来源:CSDN
作者:沐风清寒
链接:https://blog.csdn.net/qq_41891805/article/details/104355571