标签:基础 next value maxsize ret 删除元素 tostring new 无法
百度百科
上,栈是这么定义的:
堆栈
,它是一种运算受限
的线性表
。限定仅在表尾进行插入
和删除
操作的线性表。这一端被称为栈顶
,相对地,把另一端称为栈底
。向一个栈插入新元素又称作进栈、入栈或压栈
,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈
,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。稍微介绍一下关键名词:
数组和链表实现
,他们的物理存储结构不同。但是逻辑结构(实现的目的
)相同。数组在末尾插入删除
更容易,而单链表通常在头插入删除
更容易。所以数组可以用末尾做栈顶,而链表可以头做栈顶。
栈的应用:
这里我们介绍数组实现的栈和链表实现的栈。
后进先出
,我们很容易在数组的末尾进行插入和删除。所以我们选定末尾为栈顶
。所以对于一个栈所需要的基础元素是 一个data数组和一个top(int)表示栈顶位置。private T data[];
private int top;
public seqStack() {
data=(T[]) new Object[10];
top=-1;
}
public seqStack(int maxsize)
{
data=(T[]) new Object[maxsize];
top=-1;
}
栈的核心操作之一push:入栈操作。
top++;a[top]=value;
return data[top--];
不弹出
.所以只需满足题意时候return data[top]
即可。有数组实现,链表当然也能实现。对于栈的运算。大致可以分为两种思路:
低在查询
。而查询到尾部效率很低。而我们就算用了尾指针,可以解决尾部插入效率。但是依然无法解决删除效率(删除需要找到前节点).还需要双向链表。前面虽然详细介绍过双向链表,但是这样未免太复杂!长话短说,短话不说
。直接上代码就懂。 链表的节点:
static class node<T>
{
T data;
node next;
public node() {
}
public node(T value)
{
this.data=value;
}
}
基本结构:
public class lisStack <T>{
int length;
node<T> head;//头节点
public lisStack() {
head=new node<>();
length=0;
}
//其他方法
}
与单链表头插入一致,如果不太了解请先看笔者队线性表介绍的。
和数组形成的栈有个区别
。就是理论上栈没有大小限制(不突破内存系统限制)。不需要考虑是否越界。
team
入栈head.next=team;
team.next=head.next;head.next=team;
与单链表头删除一致,如果不太了解请先看笔者队线性表介绍的。
和数组同样需要判断是否为空。
team
出栈不需要考虑链表是否为1个节点
。如果为1个节点,team.next=null.执行完毕head.next=null。变为空,满足条件。不弹出
.所以只需判空满足题意时候return head.next.data
即可。而length你可以遍历链表返回长度,也可以动态设置(本文采取)跟随栈长变化。其他操作直接看api。package 队栈; public class seqStack<T> { private T data[]; private int top; public seqStack() { data=(T[]) new Object[10]; top=-1; } public seqStack(int maxsize) { data=(T[]) new Object[maxsize]; top=-1; } boolean isEmpty() { return top==-1; } int length() { return top+1; } boolean push(T value) throws Exception//压入栈 { if(top+1>data.length-1) { throw new Exception("栈已满"); } else { data[++top]=value; return true; } } T peek() throws Exception//返回栈顶元素不移除 { if(!isEmpty()) { return data[top]; } else { throw new Exception("栈为空"); } } T pop() throws Exception { if(isEmpty()) { throw new Exception("栈为空"); } else { return data[top--]; } } public String toString() { if(top==-1) { return ""; } else { String va=""; for(int i=top;i>=0;i--) { va+=data[i]+" "; } return va; } } }
package 队栈; public class lisStack <T>{ static class node<T> { T data; node next; public node() { } public node(T value) { this.data=value; } } int length; node<T> head;//头节点 public lisStack() { head=new node<>(); length=0; } boolean isEmpty() { return head.next==null; } int length() { return length; } public void push(T value) {//近栈 node<T> team=new node<T>(value); if(length==0) { head.next=team; } else { team.next=head.next; head.next=team;} length++; } public T peek() throws Exception { if(length==0) {throw new Exception("链表为空");} else {//删除 return (T) head.next.data; } } public T pop() throws Exception {//出栈 if(length==0) {throw new Exception("链表为空");} else {//删除 T value=(T) head.next.data; head.next=head.next.next;//va.next length--; return value; } } public String toString(){ if(length==0) {return "";} else { String va=""; node team=head.next; while(team!=null) { va+=team.data+" "; team=team.next; } return va; } } }
简单
。很容易理解,实现起来也相对容易。但是要注意数组情况的界限问题。后面将介绍队列
,相比栈,队列内容更丰富一些。难度也稍大一些。不好需要改进
还请指出
!
标签:基础 next value maxsize ret 删除元素 tostring new 无法
原文地址:https://www.cnblogs.com/bigsai/p/11357229.html