数据结构(栈的操作)C语言实现

# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>

typedef struct Node
{
    int data;
    struct Node *pNext;
}NODE,* PNODE;

typedef struct Stack
{
    PNODE pTop;
    PNODE pBottm;
}STACK,* PSTACK;

void initStack(PSTACK pS);
void pushStack(PSTACK pS,int val);
void traverseStack(PSTACK pS);
bool popStack(PSTACK pS,int *pVal);
bool empty(PSTACK pS);
void clearStack(PSTACK pS);

int main(void)
{
    STACK s;
    printf("%p\n",s);
    int val;
    initStack(&s);//目的是造出一个空栈
    pushStack(&s,1);
    pushStack(&s,2);
    pushStack(&s,3);
    pushStack(&s,4);
    pushStack(&s,5);
    traverseStack(&s);

    if(popStack(&s,&val))
    {
        printf("出栈成功,出栈的元素是%d\n",val);
    }
    else
    {
        printf("出栈失败\n");
    }
    traverseStack(&s);
    clearStack(&s);
    traverseStack(&s);
    if(popStack(&s,&val))
    {
        printf("出栈成功,出栈的元素是%d\n",val);
    }
    else
    {
        printf("出栈失败\n");
    }

    return 0;
}
void initStack(PSTACK pS)
{
    pS->pTop=(PNODE)malloc(sizeof(NODE));
    if(pS->pTop==NULL)
    {
        printf("动态内存分配失败!\n");
        exit(-1);
    }
    else
    {
        pS->pBottm=pS->pTop;//pS->pBottm->pNext=pS->pTop->pNext ?
        pS->pTop->pNext=NULL;
    }
}
void pushStack(PSTACK pS,int val)
{
    PNODE pNew=(PNODE)malloc(sizeof(NODE));
    pNew->data=val;
    pNew->pNext=pS->pTop;//因为刚开始pTop和pBottom指向的都是同一个节点,所以pS->pTop=pS->pBottom
    pS->pTop=pNew;

    return;
}
void traverseStack(PSTACK pS)
{
    PNODE p=pS->pTop;
    while(p !=pS->pBottm)
    {
        printf("%d ",p->data);
        p=p->pNext;
    }
    printf("\n");
    return;
}
bool empty(PSTACK pS)
{
    if(pS->pTop==pS->pBottm)
        return true;
    else
        return false;
}
//把pS指向的栈出栈一次,并将出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,否则返回true
bool popStack(PSTACK pS,int *pVal)
{
    if(empty(pS))//pS本身存放的就是s的地址
    {
        return false;
    }
    else
    {
        PNODE r=pS->pTop;//目的是为了释放那一块内存
        *pVal=r->data;
        pS->pTop=r->pNext;
        free(r);
        r=NULL;

        return true;
    }
}
//清空
void clearStack(PSTACK pS)
{
    if(empty(pS))
    {
        return;
    }
    else
    {
        PNODE p=pS->pTop;
        PNODE q=NULL;
        while(p !=pS->pBottm)
        {
            q=p->pNext;
            free(p);
            p=q;
        }
        pS->pTop=pS->pBottm;
    }
}

原文地址:https://www.cnblogs.com/zhujialei123/p/9195574.html

时间: 2024-10-13 17:51:38

数据结构(栈的操作)C语言实现的相关文章

数据结构——栈的操作

栈是先进后出的,队列是先进先出的. 栈顶在上面,栈是向上生长的,每次数据操作是压栈,最后的数据元素指向栈顶. 实例:用两个栈实现队列 题目:用两个栈实现一个队列,队列的声明如下,请实现他的连个函数,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 1 template<typename T>class CQueue 2 { 3 public: 4 CQueue(void); 5 ~CQueue(void); 6 void appendTail(const T& node); 7

数据结构-栈有关操作算法

#include <stdio.h>#include <stdlib.h> #define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OVERFLOW -2#define OK 1#define ERROR 0 typedef int SElemType; //栈结构体typedef struct {    SElemType *base;    SElemType *top;    int stacksize;}SqS

数据结构 栈笔记

// 数据结构 栈的实现 C语言, 只能从头部储存和销毁数据 # include <stdio.h> # include <stdlib.h> # include <malloc.h> // 线性储存部分 typedef struct NONE { int data; struct NONE * pNext; }None, * pNone; // 栈的头部和底部 typedef struct stack { pNone top; pNone bottom; }St, *

栈的实现与操作(C语言实现)

栈的定义  1, 栈是一种特殊的线性表  2,栈仅能在线性表的一端进行操作  3,栈顶(Top): 同意操作的一端 同意操作的一端  4,栈底(Bottom): ,不同意操作的一端 不同意操作的一端 这里我做出了 栈的顺序实现 和 链式实现.分别例如以下: =========================================华丽丽的切割线========================================================== 栈的顺序实现: 首先

对栈的操作和算法实现

一.栈的定义 从数据结构角度看,栈也是线性表,其特殊性在于栈的基本操作都是线性操作的子集,它是操作受限的线性表. 栈(stack)是限定仅在表尾进行插入或删除操作的线性表. 栈一般分为两种: 静态栈:用数组实现: 动态栈:用链表实现. 一般用的比较多的都是动态栈.如果学会了链表,其实对栈的操作就比较简单了. 二.栈的结构 空栈的结构:(其实就是栈顶和栈顶都指向一个不存放有效数据的头结点) 存有结点的栈结构:(栈顶指针指向栈顶结点,栈底指针指向头结点) 三.用C语言实现 /* 2016年9月17日

数据结构——栈和队列相关算法实现

数据结构栈和队列的基本算法实现 限定性线性表--栈 栈的定义 栈作为一种限定性的线性表,是将线性表的插入和删除操作限制为仅在表的一端进行. 基本算法演示 /* 栈的常见操作: 1.初始化栈 2.元素进栈 3.元素出栈 4.栈的遍历 5.判断栈是否为空栈 6.清空整个栈 */ # include <stdio.h> # include <stdlib.h> typedef struct Node { int date; struct Node * pNext; }NODE,* PNO

基本数据结构 -- 栈详解

栈是一种后进先出的线性表,是最基本的一种数据结构,在许多地方都有应用. 一.什么是栈 栈是限制插入和删除只能在一个位置上进行的线性表.其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的另一端叫做栈底(bottom).对栈的基本操作有 PUSH(压栈)和 POP (出栈),前者相当于表的插入操作(向栈顶插入一个元素),后者则是删除操作(删除一个栈顶元素).栈是一种后进先出(LIFO)的数据结构,最先被删除的是最近压栈的元素.栈就像是一个箱子,往里面放入一个小盒子就相当于

数据结构-栈

定义 栈(Stack):只允许在一端进行插入或删除操作的线性表.首先栈是一种特殊的线性表,但是限定这种线性表只能在某一端进行插入和删除操作,如图3-1所示. 栈顶(top):线性表允许进行插入和删除的那一端. 栈底(bottom):固定的,不允许进行插入和删除的另一端. 空栈:不含任何元素的空表. 逻辑结构 添加元素只能在尾节点后添加,删除元素只能删除尾节点,查看节点也只能查看尾节点. 形象的说,栈是一个先进后出(LIFO)表,先进去的节点要等到后边进去的节点出来才能出来. 存储结构 栈的存储方

栈的操作

学习了数据结构之的顺序表与链表之后,再去接触栈的操作,觉得简单多了.自己就想用栈来实现下实际功能.但是遇到了麻烦(对于初学者来说),不管结果怎样,这都是一次成长的过程,虽然现在问题没有解决,但是我先把他以微博的形式记录下来,以遍我在以后能解决它. #include<stdio.h> #include<stdlib.h> #include<malloc.h> #include"string.h" typedef char NoteType; //#in

《数据结构与算法分析:C语言描述》复习——第四章“树”——AVL树

2014.06.15 16:22 简介: AVL树是一种高度平衡的二叉搜索树,其命名源自于联合发明算法的三位科学家的名字的首字母.此处“平衡”的定义是:任意节点的左右子树的高度相差不超过1.有了这个平衡的性质,使得AVL树的高度H总是接近log(N),因此各种增删改查的操作的复杂度能够保证在对数级别.没有bad case是AVL树与普通的二叉搜索树的最大区别.为了实现平衡性质,我们需要记录每个节点的高度(或者平衡因子)来检测不平衡的情况.为了修正高度不平衡,需要用到“旋转”的方法,分为单旋转和双