13 一个完整的链栈代码

项目结构:

main.cpp:

#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include "function_for_LinkStack.h"

using namespace std;

int main()
{
    TestLinkStack();

    return 0;
}

function_for_LinkStack.h:

#ifndef FUNCTION_FOR_LINKSTACK_H_INCLUDED
#define FUNCTION_FOR_LINKSTACK_H_INCLUDED

/*
    链栈是运算受限的单链表,只能在链表头部进行操作
    链表的头指针就是栈顶
    不需要头节点
    基本不存在栈满的情况
    空栈 相当于 头指针指向空
    插入和删除仅在栈顶出执行
    节点之间的链接方向:(头节点)栈顶->栈底
*/

typedef char ElemType;

typedef struct StackNode{
    ElemType data;      //数据域
    struct StackNode *next;     //指针域
}StackNode, *LinkStack;

//初始化链栈
void InitStack(LinkStack &S);

//判空
int StackEmpty(LinkStack S);

//入栈
void Push(LinkStack &S, ElemType e);

//出栈
void Pop(LinkStack &S);

//出栈并获取栈顶元素
ElemType Pop_with_elem(LinkStack &S);

//获取栈顶元素
ElemType GetTop(LinkStack &S);

//打印栈中元素(自顶向下)
void PrintStack(LinkStack S);

//测试
void TestLinkStack();

#endif // FUNCTION_FOR_LINKSTACK_H_INCLUDED

function_for_LinkStack.cpp:

#include<stdio.h>
#include<stdlib.h>
#include "function_for_LinkStack.h"

//初始化链栈
void InitStack(LinkStack &S){
    //构造一个空栈,栈顶指针置空
    S=NULL;
}

//判空
int StackEmpty(LinkStack S){
    if(S == NULL){
        return 1;
    }else{
        return 0;
    }
}

//入栈
void Push(LinkStack &S, ElemType e){
    LinkStack p = (LinkStack)malloc(sizeof(StackNode));     //生成新节点
    p->data = e;        //数据域置为e
    p->next = S;        //将新节点插入栈顶
    S=p;        //修改栈顶指针
}

//出栈
void Pop(LinkStack &S){
    //先判断栈是否为空
    if(S == NULL){
        exit(0);
    }
    LinkStack p = S;        //声明新节点指向栈顶
    S = S->next;
    free(p);        //释放临时节点
}

//出栈并获取栈顶元素
ElemType Pop_with_elem(LinkStack &S){
    ElemType e;     //存放栈顶元素的数据域
    //先判断栈是否为空
    if(S != NULL){
        exit(0);
    }
    LinkStack p = S;        //声明新节点指向栈顶
    S = S->next;
    e = p->data;
    free(p);        //释放临时节点
    return e;       //返回数据域类型
}

//获取栈顶元素
ElemType GetTop(LinkStack &S){
    if(S != NULL){
        return S->data;
    }
}

//打印栈中元素(自顶向下)
void PrintStack(LinkStack S){
    LinkStack p = S;        //声明指向栈顶的指针
    while(p != NULL){
        printf("%c ", p->data);     //依次输出每个节点的数据域
        p = p->next;
    }
}

//测试
void TestLinkStack(){
    LinkStack S;        //声明栈顶节点
    printf("初始化:\n");
    InitStack(S);

    //入栈
    printf("压入元素:\n");
    Push(S, ‘a‘);
    Push(S, ‘b‘);
    Push(S, ‘c‘);
    Push(S, ‘d‘);
    Push(S, ‘e‘);

    printf("\n获取栈顶元素:%c\n", GetTop(S));
    printf("\n栈是否为空?%d\n", StackEmpty(S));
    printf("\n打印栈:\n");
    PrintStack(S);

    printf("\n出栈:\n");
    Pop(S);

    printf("\n获取栈顶元素:%c\n", GetTop(S));
    printf("\n栈是否为空?%d\n", StackEmpty(S));
    printf("\n打印栈:\n");
    PrintStack(S);

    printf("\n再压入新元素:\n");
    Push(S, ‘f‘);

    printf("\n栈是否为空?%d\n", StackEmpty(S));
    printf("\n打印栈:\n");
    PrintStack(S);

    printf("\n获取栈顶元素:%c\n", GetTop(S));
}

运行结果:

原文地址:https://www.cnblogs.com/CPU-Easy/p/11722036.html

时间: 2024-08-29 13:13:56

13 一个完整的链栈代码的相关文章

数据结构(C实现)------- 链栈

描述:      链栈,即栈的链式存储结构,链栈通常使用不带头结点的单链表来表示,因此其结点的结构和单链表的结点结构相同. 在一个链栈中,栈底就是链表的最后一个结点,而栈顶总是链表的第一个结点.因此,新入栈的元素即为链表中采用头插法新加入的结点,一个链栈可以由栈顶指针唯一确定,当top为NULL时,则表示该栈是一个空的链栈.  实现:   链栈结点的类型描述: typedef int ElemType; typedef struct node{ ElemType data; struct nod

看数据结构写代码(9)链栈的实现

在写链栈的时候 和 顺序栈一样 犯了两个错误: 一个是 在 入栈 和 进栈顶时候 忘记 操作 linkstack.len 了,另一个是 在写 stackClear 的时候 犯了一个 低级的内存错误. 这两个问题 都是 粗心造成的. 希望 引以为戒 在做下一个例子:数值转换时,又发现了一个问题:在 stackPop 没有返回 pop元素的值.唉  欢迎指出代码不足 下面上代码: // LinkStack.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h"

判断一个字符串是否为回文-链队(新建,进队,出队),链栈(新建,进栈,出栈)

回文:字符对称排列的字符串,例如ABCBA 思路:根据队:先进先出和栈: 先进后出的原则,进行比较出队和出栈的字符是否相等.如果相等,则为回文. 创建控制台应用程序. 1 #region 字符节点类 2 class CharNode 3 { 4 public char Char //字符 5 { 6 get; 7 set; 8 } 9 public CharNode Next //下一节点 10 { 11 get; 12 set; 13 } 14 public CharNode(char Cha

Solidworks api帮助代码报错 “特性说明符不是一个完整的语句。请使用行继续符将该特性应用于下列语句。“的解决办法!

相信大家经常会把solidworks api帮助中的代码直接贴出来直接使用,今天遇到段代码就无法使用.现分享一下经验: <ComVisibleAttribute(True)> _ Public Class clsPropMgr 上面的代码就会报错:"特性说明符不是一个完整的语句.请使用行继续符将该特性应用于下列语句." 怎么解决呢?其实很简单! 解决方法1: 两行合成一行 <ComVisibleAttribute(True)> Public Class clsP

你相信么,只需一个函数5行JS代码即可在Javascript中实现完整的AOP功能

你相信么,只需一个函数5行JS代码即可在Javascript中实现完整的AOP功能, 你相信么,在JavaScript只需一个函数5行代码即可实现完整的面向方面AOP编程功能.这5行代码的功能包括: 无限层次的函数无害拦截 函数执行前拦截 检查函数的参数值 重新设定函数的参数值 函数执行后拦截 检查函数执行后的返回结果 重新设定函数的返回结果 虽然动态函数式语言的效率是一个存在的问题,但是对于它的高度灵活性,简直让人令人惊叹不已,剧赞. 这个小小的函数源自于和爱明兄的一次讨论:在javascri

Mac内核XNU的Mach子系统的一个完整过程的代码跟踪

一个完整的mach子系统 mach子系统包括了很多内核功能的实现,比如VM子系统(内存管理).host子系统(主机硬件信息的处理).thread子系统(thread相关实现).exc子系统(异常处理相关):现在拿thread_act为例来跟踪一下代码,希望能够简单地了解vm子系统的概况. (1)thread_act子系统的实现分为两部分: thread_actServer.c和thread_actUser.c,分别实现了内核中mach msg消息接收和发送的各个API. 基本逻辑是:调用thre

C++ Primer 学习笔记_26_类与数据抽象(12)--分别用C和C++来实现一个链栈

下面通过分别用C和C++来实现一个链栈(链表实现),从中体会数据封装抽象的思想: [C++实现] #include <iostream> using namespace std; class Stack { private: struct Link { int data_; Link *next_; Link(int data, Link *next) : data_(data), next_(next) { } }; public: Stack() : head_(0), size_(0)

栈的Java实现--链栈

栈的Java实现--链栈 链栈,顾名思义,就是以链表的形式实现的栈的相关操作,其实是功能弱化了的链表,如果已经阅读过链表的实现代码,那么链栈的实现显得更为容易. 链栈的基本结构: 链栈的入栈操作: 让top引用指向新的节点,新节点的next指向原来的top 记录栈内元素个数的size+1 链栈的出栈操作: top引用指向原栈顶元素的下一个元素(top.next),并释放原栈顶元素的引用 记录栈内元素个数的size-1 链栈的Java实现代码: package com.liuhao.DataStr

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈