链栈的c语言实现

1.链栈结构

typedef struct StackNode
{
        SElemType data;
        struct StackNode *next;
}StackNode,*LinkStackPtr;

typedef struct
{
        LinkStackPtr top;
        int count;
}LinkStack;

2.构造一个空栈S

Status InitStack(LinkStack *S)
{
        S->top = (LinkStackPtr)malloc(sizeof(StackNode));
        if(!S->top)
                return ERROR;
        S->top=NULL;
        S->count=0;
        return OK;
}

3. 把S置为空栈

Status ClearStack(LinkStack *S)
{
        LinkStackPtr p,q;
        p=S->top;
        while(p)
        {
                q=p;
                p=p->next;
                free(q);
        }
        S->count=0;
        return OK;
}

4. 若栈S为空栈,则返回TRUE,否则返回FALSE

Status StackEmpty(LinkStack S)
{
        if (S.count==0)
                return TRUE;
        else
                return FALSE;
}

5. 返回S的元素个数,即栈的长度

int StackLength(LinkStack S)
{
        return S.count;
}

6.若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR

Status GetTop(LinkStack S,SElemType *e)
{
        if (S.top==NULL)
                return ERROR;
        else
                *e=S.top->data;
        return OK;
}

7. 插入元素e为新的栈顶元素

Status Push(LinkStack *S,SElemType e)
{
        LinkStackPtr s=(LinkStackPtr)malloc(sizeof(StackNode));
        s->data=e;
        s->next=S->top;	/* 把当前的栈顶元素赋值给新结点的直接后继,见图中① */
        S->top=s;         /* 将新的结点s赋值给栈顶指针,见图中② */
        S->count++;
        return OK;
}

8.若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR

Status Pop(LinkStack *S,SElemType *e)
{
        LinkStackPtr p;
        if(StackEmpty(*S))
                return ERROR;
        *e=S->top->data;
        p=S->top;					/* 将栈顶结点赋值给p,见图中③ */
        S->top=S->top->next;    /* 使得栈顶指针下移一位,指向后一结点,见图中④ */
        free(p);                    /* 释放结点p */
        S->count--;
        return OK;
}

9.显示全部数据

Status StackTraverse(LinkStack S)
{
        LinkStackPtr p;
        p=S.top;
        while(p)
        {
                 visit(p->data);
                 p=p->next;
        }
        printf("\n");
        return OK;
}
Status visit(SElemType c)
{
        printf("%d ",c);
        return OK;
}

参考<<大话数据结构>>

链栈的c语言实现

时间: 2024-10-09 11:03:46

链栈的c语言实现的相关文章

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

【小白成长撸】--链栈(C语言版)

1 // 链栈.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <stdio.h> 6 #include <stdlib.h>//malloc的头文件 7 8 typedef struct line_stack//栈包装 9 { 10 int x; 11 struct line_stack *next; 12 }link; 13 14 void pushes(link **top, int

C语言链栈

链栈与链表结构相似 1 typedef int elemtype; 2 3 typedef struct linkedStackNode{ 4 elemtype e; 5 struct linkedStackNode *next; 6 }LinkedStack; 7 8 LinkedStack *init_LinkedStack(){ 9 10 LinkedStack *top = (LinkedStack *)malloc(sizeof(LinkedStack)); 11 if(top==NU

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

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

C语言数据结构链栈(创建、入栈、出栈、取栈顶元素、遍历链栈中的元素)

/**创建链栈*创建一个top指针代表head指针*采用链式存储结构*采用头插法创建链表*操作 创建 出栈 入栈 取栈顶元素*创建数据域的结构体*创建数据域的名称指针*使用随机函数对数据域的编号进行赋值*/ #include<stdio.h>#include<stdlib.h>#include<string.h>#include<time.h>#define OK 1#define ERROR 0#define NAMESIZE 255//字符串的最大长度

栈的C语言源码

1.导言(为什么要用栈?) 通常来说,决定采用何种方式来存储数据是非常重要的,这样便于对数据检索时,数据会自动按照某种规定的顺序给出.栈和队列是检索数据的一种常用的数据结构.栈和队列是两种非常重要的数据结构,从数据结构来看,栈和队列也是线性表.是操作受限的线性表,栈只能在一端(栈顶)进行插入和删除,队列只能在一端(队尾)进行插入在另一端(队头)进行删除.但是从数据类型来说,栈和队列是和线性表不大相同两类重要的抽象数据类型.这里,首先重点介绍栈,以及栈的先关操作的c语言实现.栈是按照后进先出(LI

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)

链栈的实现问题

问题描述:用链式存储实现栈的基本操作 涉及变量:top:自定义Node类,指向栈顶元素的结点 涉及教材:<数据结构--Java语言描述(第2版)> 清华大学出版社 大致思路: 链式存储结构一般是通过链接结点类来形成链 出栈是由栈顶元素向栈底元素方法依次输出 则top的位置需指向栈顶元素 判空的根据是top结点是否为空,即栈顶元素是否存在 置空只需要将top指针指向null,则可以重新开始入栈操作 求长度需要遍历了全部结点后才能计算准确长度 陈列元素也需要遍历各元素,与求长度的算法有点类似,只是

链栈的实现

链栈即链式栈,也就是说我们不用再考虑空间的大小,可随心所欲的进行数据的插入/删除了.和顺序栈一样,仍然要保持其stack的特性,只在一端进行插入和删除,后进先出. 示例代码: #ifndef _LINKSTACK_H #define _LINKSTACK_H typedef int ElemType; typedef int Status; typedef struct linkStack { ElemType data; struct linkStack * top; }linkStack;