33_栈程序演示.swf
pBottom执行栈底有效元素的前一个节点,该节点没有存储有效数据,这样设计是便于栈的管理,向链表一样pHead指向链表的第一个节点,该节点是不存储有效数据的
pTop执行栈顶最新的节点
如果pTop和pBottom的值一样,说明栈是空的
经过初始化栈之后,栈的结构是:
向栈中添加一个数据
所以pBottom永远执行栈顶有效节点的前一个节点,该节点不存储有效数据,该节点的pNext下一个节点为NULL
- #include<stdio.h>
- #include<malloc.h>
- #include <stdio.h>
- #include <stdlib.h>
- /*
- 使用链表使用一个栈的数据结构
- */
- //定义一个链表的节点
- typedef struct Node{
- int data;//数据域
- struct Node * pNext;
- }NODE,*PNODE;
- typedef struct Stack{
- PNODE pTop; //栈顶指针
- PNODE pBottom; //栈底的指针
- }STACK,*PSTACK; //STACK等价于 struct Stack, PSTACK等价于 struct Stack*
- /*初始化栈
- void init(struct Stack* pStack){
- */
- void initStack(PSTACK pStack){
- pStack->pTop = (PNODE)malloc(sizeof(NODE));
- if(NULL == pStack->pTop ){
- printf("分配内存失败");
- exit(-);
- }else{
- pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
- pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点
- }
- }
- /*
- 将数据放入栈中
- */
- void pushStack(PSTACK pStack,int val){
- PNODE pNew = (PNODE)malloc(sizeof(NODE));//产生一个新的节点
- pNew->data = val;//把值添加到新的节点中
- pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
- pStack->pTop = pNew;//最新栈顶的值等于最新的节点
- }
- /**对栈的数据进行遍历操作
- 栈的数据是先进后出
- 定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出
- */
- void traverse(PSTACK pStack){
- PNODE p = pStack->pTop;
- //对p进行遍历输出
- while(p != pStack->pBottom){
- //输出变量的结果
- printf("%d\n",p->data);
- p = p->pNext;
- }
- }
- int main(){
- STACK s;//
- initStack(&s);
- pushStack(&s,);
- pushStack(&s,);
- pushStack(&s,);
- pushStack(&s,);
- traverse(&s);
- return ;
- }
我们来看程序的运行效果是:
可以完善下面的代码:
- #include<stdio.h>
- #include<malloc.h>
- #include <stdio.h>
- #include <stdlib.h>
- /*
- 使用链表使用一个栈的数据结构
- */
- //定义一个链表的节点
- typedef struct Node{
- int data;//数据域
- struct Node * pNext;
- }NODE,*PNODE;
- typedef struct Stack{
- PNODE pTop; //栈顶指针
- PNODE pBottom; //栈底的指针
- }STACK,*PSTACK; //STACK等价于 struct Stack, PSTACK等价于 struct Stack*
- /*初始化栈
- void init(struct Stack* pStack){
- */
- void initStack(PSTACK pStack){
- pStack->pTop = (PNODE)malloc(sizeof(NODE));
- if(NULL == pStack->pTop ){
- printf("分配内存失败");
- exit(-);
- }else{
- pStack->pBottom = pStack->pTop;//二者指向同一个内存单元
- pStack->pBottom->pNext = NULL; //pBottom指向栈底有效节点的前一个节点,该节点不存储有效数据,该节目之前没有任何其他节点
- }
- }
- /*
- 将数据放入栈中
- */
- void pushStack(PSTACK pStack,int val){
- PNODE pNew = (PNODE)malloc(sizeof(NODE));//产生一个新的节点
- pNew->data = val;//把值添加到新的节点中
- pNew->pNext = pStack->pTop;//让新的节点的下一个节点等于现在栈顶
- pStack->pTop = pNew;//最新栈顶的值等于最新的节点
- }
- /*判断栈是否是空*/
- bool isEmpty(PSTACK pStack){
- if(pStack->pTop == pStack->pTop){
- return true;//空栈
- }else{
- return false;
- }
- }
- /*数据的出栈,将出栈的数据保存到int*val中*/
- bool popStack(PSTACK pStack,int*val){
- if(isEmpty(pStack)){//栈是空的
- return false;
- }else{
- PNODE p = pStack->pTop;
- (*val) = p->data;
- pStack->pTop = p->pNext;
- free(p); //一定要记得释放内存
- p= NULL;
- return true
- }
- }
- /*清空栈的元素
- 让栈回到初始化的状态
- */
- void clear(PSTACK pStack){
- if(isEmpty(pStack)){//栈是空的
- return ;
- }else{
- PNODE p = pStack->pTop;
- PNODE q = NULL;
- while(p != pStack->pBottom ){
- q = p->pNext;
- free(p);
- p=q;
- }
- //最后
- pStack->pTop = pStack->pBottom;
- }
- }
- /**对栈的数据进行遍历操作
- 栈的数据是先进后出
- 定义一个变量p,在遍历的时候只有p不等于pBottom,就可以将p的值输出
- */
- void traverse(PSTACK pStack){
- PNODE p = pStack->pTop;
- //对p进行遍历输出
- while(p != pStack->pBottom){
- //输出变量的结果
- printf("%d\n",p->data);
- p = p->pNext;
- }
- }
- int main(){
- STACK s;//
- initStack(&s);
- pushStack(&s,);
- pushStack(&s,);
- pushStack(&s,);
- pushStack(&s,);
- traverse(&s);
- return ;
- }
33_栈程序演示.swf的更多相关文章
- 47 _ 循环队列程序演示.swf
通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h&g ...
- C程序演示产生僵死进程的过程
先抄录网上一段对僵死进程的描述: 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种 ...
- 制作Android Demo GIF:程序演示效果GIF图录制
[转] 制作Android Demo GIF:程序演示效果GIF图录制 在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...
- MapGuide应用程序演示样例——你好,MapGuide!
图 3‑4显示了基于MapGuide的Web应用程序的开发流程,整个开发流程能够分为五个阶段.图中,矩形代表任务,椭圆形被任务使用的或被任务创建的实体,箭头代表数据流. 1) 载入文件类型的数据,配置 ...
- Java全栈程序员之03:Ubuntu下安装idea
JetBrains的产品我曾经用过很长一段时间,它们是resharper和dotcover.VS号称宇宙最强IDE,直到它遇到了resharper,我们才知道,原来vs可以更好.DotCover是一个 ...
- 【UNIX网络编程(三)】TCP客户/server程序演示样例
上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...
- 20155301第十一周java课栈程序
20155301第十一周java课栈程序 内容一:后序表达式: abcde/-f+ 内容二:根据填充以下代码: import java.util.Scanner; public class MyDCT ...
- html5 canvas程序演示--P1197 [JSOI2008]星球大战
html5 canvas程序演示--P1197 [JSOI2008]星球大战 <!doctype html> <html> <head> <meta char ...
- Java全栈程序员之08:MAVEN+JAVA配置
从Spring3.0开始,Spring支持以Java配置的方式来代替XML配置.这一点说起来其实有点可笑,XML配置的方式最初被创建出来就是为了让配置与程序员无关.可是最终我们发现,绝大多数的那些配置 ...
随机推荐
- [SD.TEAM语录]AC语录
决定做了就要马上去做,不要有任何犹豫 本站文章为宝宝巴士 SD.Team原创,转载务必在明显处注明:(作者官方网站:宝宝巴士) 转载自[宝宝巴士SuperDo团队] 原文链接: http:// ...
- 乌云jsonp案例
新浪微博之点击我的链接就登录你的微博(JSONP劫持) 生活处处有惊喜啊!逛逛wooyun都能捡到bug. 测试的时候没关burp,逛乌云的时候抓到一条url: http://login.sina.c ...
- python3程序开发指南——第1章 笔记
python文件的扩展名为.py ,但是python GUI程序的扩展名为.pyw 在python中,注释以#开始,作用范围为该行 IDLE提供了三个关键功能:输入python表达式与代码,并在pyt ...
- Win2003远程桌面突然无法连接,有没有解决方法?
在日常工作中,运维人员除了接触服务器监控工具外,最常用的应该就是远程桌面了吧.iis7远程桌面是一款绿色小巧的服务器管理工具,更加人性化,管理服务器更是不可测量. 可以管理1000台服务器的远程桌面: ...
- Rocket - tilelink - AtomicAutomata
https://mp.weixin.qq.com/s/O7VTHqpCFNJQi3EpucXkIw 简单介绍AtomicAutomata的实现.(细节问题太多,恕不完全表述.) 1. ...
- 聚类算法之k-均值聚类
k-均值聚类算法 优点:容易实现 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢 适用数据类型:数值型数据 其工作流程:首先,随机确定k个初始点作为质心,然后将数据集中的每个点分配到一个簇中,具 ...
- undefined attribute name (XXXX)
Window --> Preferences --> Web --> HTML Files --> Editor --> Validation --> Attrib ...
- JAVASE(七)面向对象:封装性(特性之一)、构造器、属性、关键字
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.封装性 1.为什么要使用封装性? 创建对象以后,可以通过对象.属性名的方法进行赋值.只能限制数据的类 ...
- ASP.Net Web中Repeater怎么删除指定行
使用OnItemCommand事件 首先附上相关的代码 <asp:Repeater ID="Repeater1" runat="server" OnIte ...
- 钻进 Linux 内核看个究竟
Linux 内核,这个经常听见,却不不知道它具体是干嘛的东西,是不是觉得非常神秘? Linux 内核看不见摸不着,而对于这类东西,我们经常无从下手.本文就以浅显易懂的语言,带你钻进 Linux 内核, ...