链表栈

Posted jczhhxx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表栈相关的知识,希望对你有一定的参考价值。

include

//定义栈的结构体
typedef struct
int data;
stackNode next;
stackNode,
LinkStack;//这里是给这个结构体取别名,stackNode是指向栈的一种节点,*LinkStack是指栈的一个指针。
//初始化栈;
bool initStack(LinkStack &L)
stackNode p = (stackNode)malloc(sizeof(stackNode));//给链表分配一个栈节点的存储地址;
if(pNULL)return false;//如果内存不足导致分配失败则返回false
L = p;//如果成功创建栈节点,则将L指针指向分配的结点,分配的节点为头结点;
L->next = NULL;//使头结点的next指向NULL;
return true;

//判断栈是否为空,若为空返回true,否则返回false;
bool StackEmpty(LinkStack L)
if(L->next == NULL)//出现初始化条件时为空
return true;

return false;

bool push(LinkStack &L,int x)
stackNode p = (stackNode)malloc(sizeof(stackNode));
if(p
NULL)
return false;

p->data = x;
p->next = L->next;
L->next = p;
return true;

bool pop(LinkStack &L,int &x)
if(StackEmpty(S))//判断栈是否为空
return false;

x= L->next->data;
L->next = L->
return true;

bool GetTop(SqStack S,int &x,bool flag)//获取栈顶数据
if(StackEmpty(S))//判断栈是否为空
return false;

if(flag)
x = S.data[S.top];
else
x = S.data[S.rear];

return true;

bool DestroyStack(SqStack &S)
S.top = -1;
S.rear = MAXSIZE;
return true;

bool printStack(SqStack S)
if(StackEmpty(S))//判断栈是否为空
return false;

printf("前面:\\n");
for(int i=0;i<S.top+1;i++)//前面数据从0开始为数据存储单元,以top+1为循环结束条件
printf("%d",S.data[i]);

printf("\\n");
printf("后面:\\n");//前面数据从MAXSIZE-1开始为数据存储单元,以rear-1为循环结束条件
for(int j=MAXSIZE-1;j>S.rear-1;j--)
printf("%d",S.data[j]);

printf("\\n");
return true;

int main()

数据结构与算法—数组栈和链表栈

数据结构与算法—数组栈和链表栈

🌈一览众山小

栈介绍

  • 栈,存储货物或供旅客住宿的地方,可引申为仓库、中转站,所以引入到计算机领域里,就是指数据暂时存储的地方,所以才有进栈出栈的说法。

  • 栈是一种受限线性表,也就是说,栈元素具有线性关系,即前驱后继关系;只不过它是 一种特殊的线性表而已;

  • 线性表是在表尾进行插入和删除操作,而在栈中表尾是指栈顶,而不是栈底;栈的数据操作始终只在栈顶进行,即先进后出,后进先出;

栈图解

现有五个元素要进入栈中分别:1、2、3、4、5。注:元素进入栈称为"压栈"

进入后发现先进入的到了最下面,离出口最远。而最后进入的却在最上面,离出口最近

现需要对栈中数据进行取出,看看情况会是什么样。 注:栈取出元素称为" 弹栈"

可以发现最先出来的是(5),也就是最后进入的元素。以此类推,最后出来的则是(1)最先进入的元素。

这时候,我们就会发现,栈有 **“先进后出,后进先出”**这个特点。

栈实现

数组实现栈

实现思路

  • 用一个数组实现栈是很简单的。每一个栈都有一个top,对于空栈它是-1(这是空栈的初始化)

  • 为了将某个元素X压入该栈,我们将top加1,然后置stack[top] =X,其stack是代表具体的栈的数据

  • 为了弹出栈元素,我们置返回值为stack[top] ,然后 top减1

实现代码

数组栈 压栈:push()、弹栈:pop()、判满:isFull()、判空:isEmpty()、遍历:list()等方法

ArrayStack.java

class ArrayStack
    //最大容量
    private int maxSize;
    //栈数据组
    private int[] stack;
    //栈顶
    private int top = -1;
	//构造器设置最大容量
    public ArrayStack(int maxSize) 
        this.maxSize = maxSize;
        stack = new int[maxSize];
    

    //栈满
    public boolean isFull()
        //如果top等于最大为栈满
        return top == maxSize - 1;
    

    //栈空
    public boolean isEmpty()
        //如果top等于-1 则为栈空
        return  top == -1;
    

    //添加栈
    public void  push(int value)
        //如果栈满则不添加
        if (isFull())
            System.out.println("栈满!!!");
            return;
        
        //如果没有满则进行栈添加
        top++;
        stack[top] = value;
    
    //取栈值
    public int pop()
        //判断栈是否为空
        if (isEmpty())
            throw new RuntimeException("栈空!!!");
        
        int value = stack[top];
        top--;
        return value;
    
    //遍历栈
    public void  list()
        //从头到尾
        if (isEmpty())
            System.out.println("栈空!!!");
        
        for (int i = top; i >=0 ; i--) 
            System.out.printf("栈号为%d 值为 %d\\n",i,stack[i]);
        
    

主程序(测试)


public class ArrayStackDemo 
    public static void main(String[] args) 
        ArrayStack stack = new ArrayStack(5);
        System.out.println("进行压栈~~");
        stack.push(1);
        stack.push(2);
        stack.push(3);
        stack.push(4);
        stack.push(5);
        System.out.println("进行栈遍历~~");
        stack.list();
        System.out.println("进行弹栈~~");
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());
	

/* 结果
	进行压栈~~
	进行栈遍历~~
	栈号为4 值为 5
	栈号为3 值为 4
	栈号为2 值为 3
	栈号为1 值为 2
	栈号为0 值为 1
	进行弹栈~~
	5
	4
	3
	2
	1
*/

单链表实现栈

实现思路(图解)

实现代码

链表节点类

Node.java

/**
 * 链表节点
 */
class Node
    //链表值
    private int no;
    //单向链表
    private Node next;
    //构造器
    public Node(int no) 
        this.no = no;
    
    //get set方法
    public int getNo() 
        return no;
    
    public void setNo(int no) 
        this.no = no;
    
    public Node getNext() 
        return next;
    
    public void setNext(Node next) 
        this.next = next;
    

链表栈实现类

LinkedStack.java


class LinkedStack
    //头节点
    private Node head = new Node(-1);
    //栈顶 初始化为-1
    private int top =-1;
    //栈最大容量
    private int maxSize;
    //构造器获取最大容量
    public LinkedStack(int maxSize) 
        this.maxSize = maxSize;
    

    //判断栈是否满
    public boolean isFull()
        return top == maxSize -1;
    
    //判断栈是否为空
    public boolean isEmpty()
        return top == -1;
    

    //进行栈添加
    public void push(Node node)
        //先判断栈是否满
        if (isFull())
            System.out.println("栈满!!!");
        
        //第一次进行添加特殊,如果top == -1 说明第一次添加
        if (top == -1)
            head.setNext(node);
            top++;
            return;
        
        //如果不是第一次添加则进行添加逻辑
        Node temp = head;
        //将其他节点后移
        node.setNext(temp.getNext());
        //再将插入值连接到头节点
        temp.setNext(node);
        //栈顶++
        top++;
    

    //进行取栈值
    public Node pop()
        //先判断是否为空栈
        if (isEmpty())
            throw new RuntimeException("栈为空!!!");
        
        //如果不为空则进行取栈
        Node temp = head;
        Node value = temp.getNext();
        //将节点删除
        temp.setNext(value.getNext());
        top--;
        return value;
    

    //进行栈遍历
    public void list()
        //判断是否为空栈
        if (isEmpty())
            System.out.println("栈为空!!!");
        
        Node temp = head;
        //进行栈遍历
        for (int i = 0; i <= top; i++) 
            System.out.printf("栈值为:%d\\n",temp.getNext().getNo());
            //临时指针进行后移
            temp = temp.getNext();
        
    

主程序(测试)

public class LinkedStackDemo 
    public static void main(String[] args) 
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        LinkedStack linkedStack = new LinkedStack(5);
        System.out.println("链表栈进行添加!!!");
        linkedStack.push(node1);
        linkedStack.push(node2);
        linkedStack.push(node3);
        linkedStack.push(node4);
        linkedStack.push(node5);
        System.out.println("链表栈遍历!!!");
        linkedStack.list();
        System.out.println("链表栈取出!!!");
        System.out.println(linkedStack.pop().getNo());
        System.out.println(linkedStack.pop().getNo());
        System.out.println(linkedStack.pop().getNo());
        System.out.println(linkedStack.pop().getNo());
        System.out.println(linkedStack.pop().getNo());
        System.out.println("取完以后查看链表情况!!!");
        linkedStack.push(node1);
        linkedStack.push(node2);
        linkedStack.pop();
        linkedStack.list();
    

/* 结果
    链表栈进行添加!!!
    链表栈遍历!!!
    栈值为:5
    栈值为:4
    栈值为:3
    栈值为:2
    栈值为:1
    链表栈取出!!!
    5
    4
    3
    2
    1
    取完以后查看链表情况!!!
    栈值为:1
*/

栈总结

前面我们说过,栈是一个线性表。所以,任何实现表的方法都可以用来实现栈

记住本文章的几个关键字:,“先进后出,后进先出”,压栈弹栈栈顶栈底,你已经对栈有基本的了解了。

栈力扣

🌈以后关于栈的力扣题就关联在这下面把

以上是关于链表栈的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法—数组栈和链表栈

数据结构之-链表栈的实现及题目

顺序栈与链表栈的实现

使用链表栈实现计算器(+-*/)

使用链表栈实现计算器(+-*/)

图解堆算法链表栈与队列(Mark)