码迷,mamicode.com
首页 > 其他好文 > 详细

13 一个完整的链栈代码

时间:2019-10-22 20:16:29      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:next   链接   输出   项目结构   event   lib   har   open   null   

项目结构:

技术图片

 

 

 

main.cpp:

技术图片
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include "function_for_LinkStack.h"

using namespace std;

int main()
{
    TestLinkStack();

    return 0;
}
View Code

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
View Code

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));
}
View Code

 

运行结果:

技术图片

 

13 一个完整的链栈代码

标签:next   链接   输出   项目结构   event   lib   har   open   null   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!