链栈
链栈是栈的链式存储结构。栈只是栈顶进行插入和删除操作,那么栈顶放在单链表的头部还是尾部呢?由于单链表有头指针,栈顶指针也是必须的,所以可以将二者合二为一,即把栈顶放在单链表的头部
1.链栈的结构定义
class StackNode{
Object data;
StackNode next;
public StackNode(){
}
@Override
public String toString() {
return "StackNode [data=" + data + ", next=" + next + "]";
}
}
class LinkStack{
StackNode top;
int count;
public LinkStack(){
}
}
2.链栈的进栈操作
算法思路:
1. 将要新插入的数据元素的next指向当前的栈顶元素;
2. 将新的数据元素作为栈顶元素;
代码实现:
public static void pushLinkStack(LinkStack linkStack,Object e){
//入栈的新数据元素
StackNode newStackNode=new StackNode();
newStackNode.data=e;
//新数据元素的next指向当前的栈顶元素;
newStackNode.next=linkStack.top;
//将新数据元素作为栈顶元素
linkStack.top=newStackNode;
linkStack.count=linkStack.count+1;
}
3.链栈的出栈操作
算法思路:
1. 将栈顶结点内的数据赋值给e,打印要出栈的数据元素;
2. 使得栈顶指针下移一位,指向后一结点,即该结点为新的栈顶结点。
代码实现:
public static void popLinkStack(LinkStack linkStack){
if(linkStack.top==null){
System.out.println("栈内没有数据");
}else{
Object e=linkStack.top.data;
System.out.println("出栈元素为:"+e);
linkStack.top=linkStack.top.next;
linkStack.count=linkStack.count-1;
}
}
时间复杂度分析:链栈的进栈和出栈操作非常简单,时间复杂度均为O[1]。
4.顺序栈和链栈的比较
二者的时间复杂度都为O[1],对于空间性能,顺序栈需要事先确定一个固定大小的数组空间,可能会存在内存空间浪费的问题,但是存取时定位很方便。链栈则要求每个元素都有指针域,增加了内存空间,但对于栈的长度没有限制。
如果数据元素变化不太大,那么使用顺序栈比较好,如果使用过程中数据元素变化很大,使用链栈比较好。
完整代码:
package com.java.Stack;
public class LinkStackTest {
public static void main(String[] args){
LinkStack ls=new LinkStack();
pushLinkStack(ls,"S");
pushLinkStack(ls,"A");
popLinkStack(ls);
popLinkStack(ls);
popLinkStack(ls);
}
//出栈操作
public static void popLinkStack(LinkStack linkStack){
if(linkStack.top==null){
System.out.println("栈内没有数据");
}else{
Object e=linkStack.top.data;
System.out.println("出栈元素为:"+e);
linkStack.top=linkStack.top.next;
linkStack.count=linkStack.count-1;
}
}
//进栈操作
public static void pushLinkStack(LinkStack linkStack,Object e){
//入栈的新数据元素
StackNode newStackNode=new StackNode();
newStackNode.data=e;
//新数据元素的next指向当前的栈顶元素;
newStackNode.next=linkStack.top;
//将新数据元素作为栈顶元素
linkStack.top=newStackNode;
linkStack.count=linkStack.count+1;
}
}
class StackNode{
Object data;
StackNode next;
public StackNode(){
}
@Override
public String toString() {
return "StackNode [data=" + data + ", next=" + next + "]";
}
}
class LinkStack{
StackNode top;
int count;
public LinkStack(){
}
}

浙公网安备 33010602011771号