1、简介:

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

术语解释:
栈顶(Top) :允许数据插入和删除的端,即栈的顶端。
栈底(Bottom):固定并且不允许进行插入和删除操作的一端,即栈底。
栈空:即不含有任何元素的栈。
进栈、入栈或压栈:数据进入栈。
出栈或退栈:数据出栈

2、链式栈的基本操作

链式栈

2.1、初始化一个栈

 void initStack(struct Stack *ps)//初始化一个栈{//将栈顶指向头指针,ps->pTopZ这是个指针用于存放地址 ps->pTop=(struct Node*)malloc(sizeof(struct Node));  if(NULL==ps->pTop)   //判断分配是否成功 {printf("动态内存分配失败");exit(-1);}else{ps->PBottom=ps->pTop;//栈底和栈顶都指向头指针ps->PBottom->pNext=NULL;//将指针域清空}}

2.2、进栈

  int pushStack(struct Stack *ps,int i){struct Node *pNew=(struct Node*)malloc(sizeof(struct Node));//造一个新的指针指向一个节点 pNew->date=i;//将数据存入新的节点的数据域中 pNew->pNext=ps->pTop;//把前一个节点的地址(ps->pTop存放地址),赋给后一个节点的指针域。所以后一个节点指向前一个节点 ps->pTop=pNew;//在把新的节点的地址付给ps->pTop }

2.3、出栈

bool pop(struct Stack *ps,int *pval)//把ps指向的栈出栈一次,并把出栈的元素存入pval中{if(empty(ps))//如果为空直接出栈 {return false;}else{struct Node *r=ps->pTop;//将栈顶的地址付给方便不需要的空间释放 *pval=r->date;//把出栈的值存放,方便操作ps->pTop=r->pNext;free(r);//把r指向的空间释放 r=NULL;return true; }}

2.4、遍历一个栈

 void traverseStack(struct Stack *ps){struct Node *p=ps->pTop;while(p!=ps->PBottom){printf("%d",p->date);p=p->pNext;  //高存放着低的地址 }printf("\n");}

2.5、判断栈是否为空

  bool empty(struct Stack *ps)//判断栈是否为空 {if(ps->pTop==ps->PBottom){return true;}else{return false;}}

2.6、清空一个栈

bool pop(struct Stack *ps,int *pval)//把ps指向的栈出栈一次,并把出栈的元素存入pval中
{if(empty(ps))//如果为空直接出栈 {return false;}else{struct Node *r=ps->pTop;//将栈顶的地址付给方便不需要的空间释放 *pval=r->date;//把出栈的值存放,方便操作ps->pTop=r->pNext;free(r);//把r指向的空间释放 r=NULL;return true; }
}

2.7、链式完整代码

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct Node
{int date;  //数据 struct Node *pNext;
}NODE,*PNODE;typedef struct Stack
{struct Node *pTop;//栈顶指针 struct Node *PBottom;//栈底 指针
};
void initStack(struct Stack *ps);//初始化一个栈
int pushStack(struct Stack *ps,int i);//进栈
void traverseStack(struct Stack *ps);//遍历一个栈
bool pop(struct Stack *,int *);//出栈
bool empty(struct Stack *ps);//判断栈是否为空
void clear(struct Stack *ps);//清空一个栈
int main(void)
{int i,a[10];int val;struct Stack S; initStack(&S);//初始化一个栈pushStack(&S,1);//进栈 pushStack(&S,2);pushStack(&S,4);pushStack(&S,5);traverseStack(&S);  //遍历这个栈 if( pop(&S,&val)){printf("出栈成功,出栈的元素是%d\n",val); }else{printf("出栈失败!") ;}traverseStack(&S);//遍历一个栈clear(&S);  return 0;}void initStack(struct Stack *ps)//初始化一个栈{//将栈顶指向头指针,ps->pTopZ这是个指针用于存放地址 ps->pTop=(struct Node*)malloc(sizeof(struct Node));  if(NULL==ps->pTop)   //判断分配是否成功 {printf("动态内存分配失败");exit(-1);}else{ps->PBottom=ps->pTop;//栈底和栈顶都指向头指针ps->PBottom->pNext=NULL;//将指针域清空}}int pushStack(struct Stack *ps,int i){struct Node *pNew=(struct Node*)malloc(sizeof(struct Node));//造一个新的指针指向一个节点 pNew->date=i;//将数据存入新的节点的数据域中 pNew->pNext=ps->pTop;//把前一个节点的地址(ps->pTop存放地址),赋给后一个节点的指针域。所以后一个节点指向前一个节点 ps->pTop=pNew;//在把新的节点的地址付给ps->pTop }void traverseStack(struct Stack *ps){struct Node *p=ps->pTop;while(p!=ps->PBottom){printf("%d",p->date);p=p->pNext;  //高存放着低的地址 }printf("\n");}bool empty(struct Stack *ps)//判断栈是否为空 {if(ps->pTop==ps->PBottom){return true;}else{return false;}}bool pop(struct Stack *ps,int *pval)//把ps指向的栈出栈一次,并把出栈的元素存入pval中{if(empty(ps))//如果为空直接出栈 {return false;}else{struct Node *r=ps->pTop;//将栈顶的地址付给方便不需要的空间释放 *pval=r->date;//把出栈的值存放,方便操作ps->pTop=r->pNext;free(r);//把r指向的空间释放 r=NULL;return true; }}void clear(struct Stack *ps)//清空 {if(empty(ps)){return;}else{struct Node*p=ps->pTop;struct Node*q=ps->PBottom;while(p!=ps->PBottom)//如果pTop!= PBottom就继续执行 {q=p->pNext;free(p);p=q;}ps->pTop=ps->PBottom; }
}

3、顺序栈的基本操作

3.1、初始化一个栈

 int InitStack (SqStack *S)
{S->base=(ElemType*)malloc(Maxsize);if(!S->base){exit(0);} S->top=S->base;S->stackSize=Maxsize;
}

3.2、进栈

  void Push(SqStack *S,int e)
{if((*S->top)==Maxsize-1){printf("栈已满!!\n");}(*S->top)=e;S->top++;
}

3.3、出栈

void Pop(SqStack *S)
{if(S->top==S->base){printf("栈空!!\n");}--(S->top);
}

3.4、遍历一个栈

void traverseStack(SqStack *S){int *t;t=S->base;if(S->base==S->top){printf("栈空!!\n");}else{while(t!=S->top){printf("%d",*t);t++;}printf("\n");return;} }

3.5、判断栈是否为空

void empty(SqStack *S)
{if(S->top==S->base){printf("栈空!!\n");}}

3.6、清空一个栈

void ClearStack(SqStack *S)
{S->top=S->base;if(  S->top==S->base){printf("请空成功!!\n");}else{printf("请空失败!!\n");}
}

3.7、销毁一个栈

void DestrStack(SqStack *S)
{int i,len;len=S-> stackSize;for(i=0;i<len;i++){free(S->base);S->base++;}S->base=S->top=NULL;S-> stackSize=0;
}

3.8、顺序栈完整代码

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define Maxsize 100
#define OK 1
#define ERROR 0
typedef char ElemType;
typedef struct QNode
{ElemType data;struct QNode *next;
}QNode,*Queueptr;
typedef struct
{Queueptr front;Queueptr rear;}LinkQueue;
IniQueue(LinkQueue *Q)//初始化队列
{Q->front=(Queueptr)malloc(sizeof(QNode));Q->front=Q->rear;if(!Q->front){exit(0);}Q->front->next=NULL;return  OK;
}
EnQueue(LinkQueue *Q,ElemType e)//入队
{Queueptr p=(Queueptr)malloc(sizeof(QNode));p->data=e;Q->rear->next=p;Q->rear=p;Q->rear->next=NULL;return OK;}
DeQueue(LinkQueue *Q,ElemType *e) //出对
{struct QNode *p; if(Q->front==Q->rear){return;}p=Q->front->next;*e=p->data;Q->front->next=p->next;if(p==Q->rear){Q->rear=Q->front;}free(p);return OK;}
typedef struct
{int *base;int *top;int stackSize;//可用空间
}SqStack;int InitStack (SqStack *S)
{S->base=(ElemType*)malloc(Maxsize);if(!S->base){exit(0);} S->top=S->base;S->stackSize=Maxsize;
}void Push(SqStack *S,int e)
{if((*S->top)==Maxsize-1){printf("栈已满!!\n");}(*S->top)=e;S->top++;
}void Pop(SqStack *S)
{if(S->top==S->base){printf("栈空!!\n");}--(S->top);
}void empty(SqStack *S)
{if(S->top==S->base){printf("栈空!!\n");}}
void ClearStack(SqStack *S)
{S->top=S->base;if(  S->top==S->base){printf("请空成功!!\n");}else{printf("请空失败!!\n");}
}
void DestrStack(SqStack *S)
{int i,len;len=S-> stackSize;for(i=0;i<len;i++){free(S->base);S->base++;}S->base=S->top=NULL;S-> stackSize=0;
}void traverseStack(SqStack *S){int *t;t=S->base;if(S->base==S->top){printf("栈空!!\n");}else{while(t!=S->top){printf("%d",*t);t++;}printf("\n");return;} }int main(void)
{SqStack S;
InitStack (&S);//构造一个栈
Push(&S,5); //入栈
Push(&S,8);
Push(&S,4);
Push(&S,5);
Push(&S,1);
traverseStack(&S);
ClearStack(&S);//清空栈
traverseStack(&S);
//DestrStack(&S);return 0;
}

C语言 链式栈和顺序栈的实现相关推荐

  1. c语言 int top,顺序栈(C语言,静态栈)

    代码部分数组 #include #include #include #define INITSIZE 4 #define INCREMENT 2 typedef struct stack { int ...

  2. 用C语言建立一个顺序栈

    栈(stack)是一种限定只能在一端进行插入和删除的线性表.表中允许进行插入和删除操作的一端称为栈顶,表的另一端称为栈底.栈的主要特点是"先进后出",即先入栈的元素后出栈.每次进栈 ...

  3. 入栈和出栈c语言源程序,用c语言可执行文件实现顺序栈的出栈、入栈、判栈空、判栈满!急求啊? 爱问知识人...

    #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 栈定义 typedef struct { ...

  4. java顺序栈和链栈_Java的顺序栈和链式栈

    栈的定义 栈是限制在表的一段进行插入和删除的运算的线性表,通常能够将插入.删除的一端为栈顶,例外一端称为栈底,当表中没有任何元素的时候称为空栈. 通常删除(又称"退栈")叫做弹出p ...

  5. c语言建立栈(顺序栈、双栈和链式栈)

    c语言建立栈 顺序存储 栈的顺序存储定义 初始化栈 入栈操作 出栈操作 其余操作 读取栈顶元素 栈中元素个数 栈是否为空 双栈 双栈的顺序存储结构定义 建立双栈 判断栈为空 进栈操作 出栈操作 链式栈 ...

  6. 数据结构——顺序栈和链式栈的简单实现和解析(C语言版)

    摘自:数据结构学习--顺序栈和链式栈的简单实现和解析(C语言版) 作者:正弦定理 发布时间:2020-11-26 21:26:49 网址:https://blog.csdn.net/chineseko ...

  7. 栈 -- 顺序栈、链式栈的实现 及其应用(函数栈,表达式求值,括号匹配)

    文章目录 实现 顺序栈实现 链式栈实现 应用 函数栈 的应用 表达式求值中 的应用 括号匹配中 的应用 我们使用浏览器的时候经常会用到前进.后退功能. 依次访问完一串页面 a – b – c之后点击后 ...

  8. 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)

    文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...

  9. C语言实现了一个顺序栈(附完整源码)

    C语言实现了一个顺序栈 顺序栈 顺序栈结构示意图如下 C语言实现了一个顺序栈完整源码 顺序栈 用一段连续的存储空间来存储栈中的数据元素,比较常见的是用数组来实现顺序栈 顺序存储结构:1.元素所占的存储 ...

最新文章

  1. Django框架实现支付宝第三方支付
  2. Vue组件实现tips的总结
  3. redis分片_5000+字硬核干货!Redis 分布式集群部署实战
  4. Planes, Trains, but not Automobiles-求最小路径覆盖的起点终点
  5. java set方法不生效_使您的Java 8方法引用生效
  6. 伪类::selection自定义文本选中时的样式(CSS3样式),CSS3的word-break单次换行
  7. 如何给领导打造一款掌上财务管理驾驶舱?
  8. C++11/14学习(二)类型推导
  9. SearchParams(URL获取参数)
  10. Swift 面向协议编程 基础篇 (一) 介绍
  11. 华为机试HJ11:数字颠倒
  12. 安川变频器跳os_变频器常见故障代码及处理实例(经典,建议收藏)
  13. loss低但精确度低_目标检测中的Loss改进:GIOU
  14. 分享 : 微软Kinect初体验
  15. 常见的浏览器兼容问题和解决方法
  16. Win10安装Deepin双系统找不到启动项
  17. Processing——码绘与手绘对比动态篇
  18. 梯度提升树(GBDT)
  19. 《高效能人士的7个习惯》——习惯三:要事第一 之 独立意志的重要性
  20. Eclipse菜单project用法介绍

热门文章

  1. unity描边发光shader_unity shader实例#1 轮廓渲染-描边
  2. 计算机搜索文件时找不到搜索按钮,电脑搜不到文件怎么办?文件搜索软件用起来!...
  3. Java 算法 身份证排序
  4. Scrapy 一些常用方法总结(调试,定时与测试)
  5. 程序—java记事本
  6. java复选框只会选中一个_java复选框选中
  7. 怎样Interlocked.Increment一个反射得到的field?
  8. Splash resource_timeout 属性
  9. Learning Spark中文版--第三章--RDD编程(1)
  10. leetcode 61. Rotate List