栈的链式存储结构(C语言实现)

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define OK 1
  5 #define ERR 2
  6 #define TRUE 1
  7 #define FALSE 0
  8
  9 typedef int status; //定义函数返回的状态,OK & ERR
 10 typedef char datatype; //定义栈中每个元素的数据类型,这里暂定为字符型
 11
 12 typedef struct LinkStack_anon{
 13     datatype data; //数据区
 14     struct LinkStack_anon * next; //指针区
 15 } LinkStack;
 16
 17 /* 函数原型,栈的基本操作 */
 18 LinkStack *createLinkStack(datatype first_node_value);
 19 status isEmpty(LinkStack *L);
 20 void clear(LinkStack **L);
 21 datatype getTop(LinkStack *L);
 22 int getLength(LinkStack *L);
 23 status push(LinkStack *L, datatype node_to_push);
 24 datatype pop(LinkStack *L);
 25 void showStack(LinkStack *L);
 26
 27 int main(){
 28     /* 测试 */
 29     LinkStack *root; //指向一个通过createLinkStack函数创建的栈
 30     root=createLinkStack(‘f‘);
 31     printf("isEmpty = %d\n",isEmpty(root));
 32     printf("Length = %d\n",getLength(root));
 33     push(root,‘a‘);
 34     push(root,‘b‘);
 35     push(root,‘c‘);
 36     push(root,‘d‘);
 37     printf("isEmpty = %d\n",isEmpty(root));
 38     printf("Length = %d\n",getLength(root));
 39     showStack(root);
 40     putchar(‘\n‘);
 41     printf("pop = %c\n",pop(root));
 42     printf("pop = %c\n",pop(root));
 43     printf("getTop = %c\n",getTop(root));
 44     printf("isEmpty = %d\n",isEmpty(root));
 45     printf("Length = %d\n",getLength(root));
 46     showStack(root);
 47     putchar(‘\n‘);
 48     clear(&root);
 49     printf("isEmpty = %d\n",isEmpty(root));
 50     printf("Length = %d\n",getLength(root));
 51
 52     return 0;
 53 }
 54
 55 LinkStack *createLinkStack(datatype first_node_value){
 56     LinkStack *tmp;
 57     tmp=malloc(sizeof(LinkStack)); //void*类型指针能自动转为其他类型的指针
 58     tmp->data=first_node_value; //初始化栈顶的数据区
 59     tmp->next=NULL; //初始化栈顶的指针区
 60     return tmp;
 61 }
 62 status isEmpty(LinkStack *L){
 63     if (L==NULL)
 64         return TRUE;
 65     else
 66         return FALSE;
 67 }
 68 void clear(LinkStack **L){
 69     //之所以形参的类型是双重指针,是因为这个函数需要修改传入的实参的值
 70     //函数clear的作用是将栈清空,这时实参应当指向NULL,所以需要在这个函数内修改实参的值
 71     if (isEmpty(*L)==FALSE){
 72         //不为空时才执行删除
 73         LinkStack * p,* q; //p始终指向当前要被删除的结点,而q始终指向要被删除的结点的下一个
 74         p=*L; //将p指向单链表的头结点,即栈的栈顶
 75         while (p!=NULL){
 76             //不是NULL就继续
 77             q=p->next; //q始终指向下一个结点
 78             free(p); //释放p所指的结点
 79             p=q; //交换
 80         }
 81         *L=NULL; //将指向栈的指针设为NULL
 82     }
 83 }
 84 datatype getTop(LinkStack *L){
 85     LinkStack * p=L;
 86     while (p && p->next!=NULL) //遍历到最后一个结点
 87         p=p->next;
 88     return p->data;
 89 }
 90 int getLength(LinkStack *L){
 91     int i=0;
 92     LinkStack * p=L;
 93     while (p){
 94         i++; p=p->next;
 95     }
 96     return i;
 97 }
 98 status push(LinkStack *L, datatype node_to_push){
 99     //node_to_insert表示想要入栈的元素
100     //单链表中的尾插法
101     LinkStack * s=malloc(sizeof(LinkStack)); //等待入栈的新结点
102     LinkStack * p=L;
103     s->data=node_to_push;
104     s->next=NULL;
105     while(p && p->next!=NULL) //找到栈的最后一个结点
106         p=p->next;
107     p->next=s;
108     return OK;
109 }
110 datatype pop(LinkStack *L){
111     //尾删法
112     datatype s;
113     LinkStack * p=L;
114     if (isEmpty(L)) return ERR; //空栈
115     while(p && p->next->next!=NULL) //找到栈的最后一个结点的前一个结点
116         p=p->next;
117     s=p->next->data; //先将最后一个结点的值保存
118     free(p->next); //释放最后一个结点
119     p->next=NULL;
120     return s; //返回出栈的元素的值
121 }
122 void showStack(LinkStack *L){
123     int i;
124     int total=getLength(L);
125     LinkStack * p=L;
126     for (i=0; i<total; i++){
127         printf("%c\t",p->data); p=p->next;
128     }
129 }
130 /*
131     栈的定义:仅限定在表尾进行插入和删除操作的线性表,即操作受限的线性表
132     一般,把允许插入和删除的一端作为栈顶,另一端则是栈底
133     不含任何元素的栈就是空栈
134     所以,栈又称后进先出(Last in First out)的线性表
135     对于链式存储的栈,不存在栈满的情况,除非已经没有可用的内存了,如果真的发生,那此时计算机就面临死机崩溃的地步了
136 */
137 /* 环境: Code::Blocks with GCC 5.1 */

运行截图:

原文地址:https://www.cnblogs.com/ryzz/p/12228219.html

时间: 2024-10-11 04:08:58

栈的链式存储结构(C语言实现)的相关文章

栈的链式存储结构和入栈出栈操作

参考<大话数据结构>P98~99——栈的链式存储结构. 进栈: 出栈: 举个简单的例子: 代码和解释如下(VS2012测试通过): 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 typedef string status;//用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 6 7 //栈的结点 8 //包含data,和指向下一个结点

栈及栈的链式存储结构(栈链)

栈:线性结构,后进先出.栈(Stack)是一种特殊的线性表(顺序表,链表)只在表尾进行删除和插入操作. 注意:对于栈来说,表尾称为栈的栈顶(top),表头称为栈底(bottom). 栈也是线性结构的一种特例.与队列不同,他只有一个口,只能从这里读或者写数据,这个口称为栈顶(top).栈是一种先进后出的数据结构.先进来的元素会放入栈底,而后进来的元素被放在它的上面,最后进来的元素的上面的位置,称为栈顶. 栈所提供的操作比一般的线性表要少很多,只提供:初始化.销毁.判断是否为空.求栈的长度.清空栈.

栈的链式存储结构及应用(C、Java代码)

链式存储结构最大的好处就是没有空间的限制,可以通过指针指向将结点像以链的形式把结点链接,我们熟悉的线性表就有链式存储结构. 当然,栈同样有链式存储结构,栈的链式存储结构,简称链栈. 从图片可以看到,和单链表很像,拥有一个头指针top,又称作栈顶指针,所以此时就不再需要单链表里面的头结点了. 对于链栈来说,基本不存在栈满的情况,除非计算机内存已经没有了可使用的空间,如果真的存在,那么计算机系统已经面临着即将死机崩溃的情况,而不是这个链栈是否溢出的问题了. 对于空栈来说,链表的定义是头指针指向NUL

栈(链式存储结构)

堆栈:具有一定操作约束的线性表,只能在一端作插入.删除 具有后入先出的特性(Last In First Out) 分顺序存储结构.链式存储结构两种形式 堆栈的顺序存储结构 通常由一个一维数组和一个栈顶元素变量组成 图解如下: 形式一:构建结构体 0.结构初始化 #define MaxSize ### struct StackNode { ElementType Data[MaxSize]; int top; }; 1.建立空栈 struct StackNode* createStack() {

栈的链式存储结构

//1.初始化:(有头结点的情况下) S=(LStack*)malloc(sizeof(LStack));//为栈开辟内存空间 S.next=NULL;//把栈置为空 //2.入栈 p=(LStack*)malloc(sizeof(Lstack));//给入栈的元素分配内存空间 p->data=e;//把元素e插入栈内 p->next=S->next;//使得e成为了栈顶元素 S->next=p;//把移动指针放到栈顶元素的前面 //3.出栈:删除栈顶元素,并用e返回其值 if(S

数据结构 --- 链栈(栈的链式存储结构)

工程目录结构: common.h: 1 //#ifndef __common_h__ 2 //#define __common_h__ 3 4 #define OK 1 5 #define ERROR 0 6 #define TRUE 1 7 #define FALSE 0 8 9 #define MAXSIZE 20 10 11 typedef int Status; //函数的返回结果,OK.ERREO.TRUE.FALSE 12 typedef int ElemType; //结点数据域的

大话数据结构之栈的链式存储结构

#include<iostream> //#include<time.h> //#include <stdlib.h> using namespace std; #define OK 1 #define TRUE 1 #define FALSE 0 #define ERROR 0 typedef int status;//返回的状态值 typedef int elemtype;//节点里数据的类型 //每一个节点的数据结构 typedef struct stacknod

Java数据结构系列之——栈(2):栈的链式存储结构及其操作

package Stack; import LinkList.SinglyLinkList; public class LinkListStack { private SinglyLinkList<Integer> singlyLinkList; /** * 默认构造函数,用于初始化栈 */ public LinkListStack(){ singlyLinkList=new SinglyLinkList<Integer>(); } /* * 压栈操作 */ public void

栈的链式存储结构及实现

要我说,和单链表的头插入法差不多呵呵 #include<cstdio> #include<cstring> #include<cstdlib> typedef struct StackNode{ int data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct LinkStack{ LinkStackPtr top; int count; }LinkStack; int Push(Lin