单链表与栈

(一)

栈,后进先出,只允许访问一个数据项:即最后插入的数据项。栈操作:

push入栈:第一步指针上移一个单位,第二步将数据插入到这个存储单元;

pop出栈:第一步移除指针指向的数据项,第二步指针下移一个单位,指向新的栈顶元素;

peek查看:不操作元素,只是查看栈顶元素的值;

结果:

上面的实现是用数组实现的,有个最大缺点是一旦数组创建,大小不可变。下面介绍另一种存储结构-链表。

首先,在链表中,每个数据项都包含在“链结点”中,这个链结点包括存储的数据本身和一个对下一个链结点引用的字段,链表本身有一个字段指向对第一个链结点的引用。用图形标识大致是这样子的:(其实first也是一个链结点)

链结点类:

package stack;
//链结点
public class Link {
    public int data;
    public Link next;

    Link(int data){
        this.data = data;
        next = null;
    }
    public void show(){
        System.out.print(" data:"+this.data);
    }
}

单链表类:

package stack;

//单链表
public class LinkedList {
    private Link first;
    //构造函数
    LinkedList(){
        this.first = null;
    }
    public Link getFirst() {
        return first;
    }
    //在前端插入
    public void insertFirst(int data){
        Link newLink = new Link(data);
        newLink.next = first;
        first = newLink;
    }
    //在前段删除
    public void deleteFirst(){
        if(!this.isEmpty()){
            Link deleteLink = first;
            first = deleteLink.next;
            //或者 first = first.next;
        }
    }
    //判断是否为空
    public boolean isEmpty(){
        return first == null;
    }
    //遍历
    public void showLinkedList(){
        Link current = first;
        while(current != null){
            current.show();
            current = current.next;
        }
        System.out.println();
    }
}

栈类:

package stack;
public class Stack {

    private LinkedList linkedList;
    //默认构造方法
    public Stack(){
        linkedList = new LinkedList();
    }
    //进栈
    public void push(int newNum){
        linkedList.insertFirst(newNum);
    }
    //出栈
    public void pop(){
        linkedList.deleteFirst();
    }
    //查看
    public int peek(){
        return linkedList.getFirst().data;
    }
    //遍历栈
    public void showStack() {
        linkedList.showLinkedList();
    }
}

测试类:

package stack;

public class Test {
    public static void main(String[] args) {
        Stack stack = new Stack();
        stack.push(1);
        stack.push(2);
        stack.push(5);
        stack.showStack();
        stack.pop();
        stack.showStack();
    }
}

结果:

这里着重说明一下,单链表的前端插入,由于我学过c++,指针与引用作用虽然差不多,但是总用法与直观感觉不一样。

插入之前

此时 first = oldLink

插入之后

此时newLink.nest = oldLink, first = newLink

ps:画的有点粗糙!

原文地址:https://www.cnblogs.com/caozx/p/8303687.html

时间: 2024-08-12 17:37:00

单链表与栈的相关文章

单链表实现栈

#include <stdio.h> #include <stdlib.h> typedef char stack_element_t; typedef struct stack_node_s { stack_element_t element; struct stack_node_s *restp; }stack_node_t; /*Stack top pointer*/ typedef struct { stack_node_t *topp; }stack_t; void pu

日常学习随笔-数组、单链表、双链表三种形式实现栈结构的基本操作

一.栈结构 栈(stack)是限制插入和删除只能在一个位置上的表,该位置是 表的末端,叫做栈的顶(Top).对栈的基本操作有push(进栈),pop(出栈),peak(栈顶元素),size(栈容量)等. 栈的核心思想:"先进后出". 二.案例一:数组实现"栈" 1 package com.xfwl.algorithmAnalysis.stack; 2 3 import java.util.Arrays; 4 5 /** 6 * 自定义栈结构(基于数组的形式) 7 *

栈的简单实现(2)-单链表实现

引言 栈(stack)是一种被广泛使用的线性数据结构,它只允许在表的一端进行插入或删除操作,因而栈也可以被称作为操作受限的线性表 .在栈中,允许插入或删除的一端称作栈顶(top)不允许插入和删除的另一端称作栈底(bottom); 示意图如下: 此文借助单链表简单地实现栈及其基本操作. 代码如下: typedef struct stack{ int data; struct stack* next; }ListStack; 注:这里假设栈中储存的是整型 (int) 的数据 基本操作 1.栈的初始化

栈,队列,单链表,双向链表

1. 定义头文件 实现栈方法的定义,注意这里用到了全局的静态数组,可以通过这种方式保护数据. main.c,实现存储 队列,创建头文件queue.h 创建queue.c 实现main函数 单链表 在定义头文件的时候,最好使用: #ifndef 变量A #define变量A 函数声明和结构声明等声明 #endif 通过上面的这种方式可以避免重复调用头文件时候产生的负面影响. 定义头文件link.h:(注意加上extern) 定义link.c 编写main.c 4.双向链表 创建link.h头文件

栈、队列、单链表

栈: <span style="color:#000000;">#define MAX_SIZE 100//队列的最大长度 //-------------------------栈----------------------- int top=0;//栈顶变量 void add(char st[],char intput){ //入栈函数 st[top]=intput; top++; } void pop(char st[]){ //出栈函数 top--; st[top]=

python中栈的单链表实现

参考博客:https://www.cnblogs.com/stacklike/p/8284550.html 基于列表的简单实现 # 先进后出 # 以列表实现的简单栈 class SimpleStack: # 特殊属性,用以限制class可添加的属性 __slots__ = ('__items',) def __init__(self): self.__items = [] def is_empty(self): return self.__items == [] def peek(self):

栈和队列----将单链表的每K个节点之间逆序

将单链表的每K个节点之间逆序 给定一个单链表的头节点head,实现一个调整链表的函数,使得每K 个节点之间逆序,如果最后剩下不够K 个节点,则不调整最后几个. 例如: 链表:1->2->3->4->5->6->7->8->null,k=3. 调整好后:3->2->1->6->5->4->7->8->null,其中7.8不调整,因为不够一组. [解析] 1. 首先从左到右遍历链表,如果栈的大小不等于k ,则不断的

C++实现单链表和子类栈(Stack)及单向队列(Queue)

刚刚开始学习c++.之前c的内容掌握的也不多,基本只是一本概论课的程度,以前使用c的struct写过的链表.用python写过简单的数据结构,就试着把两者用c++写出来,也是对c++的class,以及继承中的public/protected/private的性质进行初步了解.第一次写头文件.h和源文件.cpp分开的c++代码.过程中参考了ProLyn和kgvito的代码,基本就是百度"单链表 c++"的前几个搜索结果. 节点listNode还是用struct来写了,因为我想节点除了构造

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int