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的更多相关文章

  1. 47 _ 循环队列程序演示.swf

    通过上面的分析我们已经对循环队列很了解了,现在我们来学习下循环队列的实现形式 1.代码使用数组现实循环队列 #include<stdio.h> #include<malloc.h&g ...

  2. C程序演示产生僵死进程的过程

    先抄录网上一段对僵死进程的描述: 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中.这种 ...

  3. 制作Android Demo GIF:程序演示效果GIF图录制

    [转] 制作Android Demo GIF:程序演示效果GIF图录制   在平时写博客或者分享自己写的程序效果的时候经常需要做成GIF图,以下就是介绍几种常用的GIF录制方法: 一.录制工具 1.( ...

  4. MapGuide应用程序演示样例——你好,MapGuide!

    图 3‑4显示了基于MapGuide的Web应用程序的开发流程,整个开发流程能够分为五个阶段.图中,矩形代表任务,椭圆形被任务使用的或被任务创建的实体,箭头代表数据流. 1) 载入文件类型的数据,配置 ...

  5. Java全栈程序员之03:Ubuntu下安装idea

    JetBrains的产品我曾经用过很长一段时间,它们是resharper和dotcover.VS号称宇宙最强IDE,直到它遇到了resharper,我们才知道,原来vs可以更好.DotCover是一个 ...

  6. 【UNIX网络编程(三)】TCP客户/server程序演示样例

    上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...

  7. 20155301第十一周java课栈程序

    20155301第十一周java课栈程序 内容一:后序表达式: abcde/-f+ 内容二:根据填充以下代码: import java.util.Scanner; public class MyDCT ...

  8. html5 canvas程序演示--P1197 [JSOI2008]星球大战

    html5 canvas程序演示--P1197 [JSOI2008]星球大战 <!doctype html> <html> <head> <meta char ...

  9. Java全栈程序员之08:MAVEN+JAVA配置

    从Spring3.0开始,Spring支持以Java配置的方式来代替XML配置.这一点说起来其实有点可笑,XML配置的方式最初被创建出来就是为了让配置与程序员无关.可是最终我们发现,绝大多数的那些配置 ...

随机推荐

  1. Matlab矩阵学习一 矩阵的创建

    Matlab矩阵创建 1.直接输入数值创建       矩阵元素要用[ ] 括起来,";"代表一行结束,以下创建方式也是合法的,矩阵的元素可以是实数,也可以是复数,复数用a+bi表 ...

  2. CE未知数值修改

    一样,用植物大战僵尸测试.来搜索修改向日葵生产阳光的CD值. 由于开始并不知道向日葵cd的初始值,所以用CE搜索未知的初始值 返回游戏,每次向日葵晃一下搜索一下减少的值. 锁定修改为0发现成功. 然后 ...

  3. 学习使用re做解析器爬小说

    一.背景:近期学习python爬虫中看到,在对网页内容进行解析的技术中,re正则表达式工具也是一个很好的工具,使用re编制爬虫工具正好熟悉re正则表达式的使用. 二.环境及爬取目标 1.linux c ...

  4. Rocket - devices - BasicBusBlocker

    https://mp.weixin.qq.com/s/m1zfFQeSoGZZduJGbxEqdQ 简单介绍BasicBusBlocker的实现. 1. BasicBusBlockerParams B ...

  5. jchdl - GSL实例 - Mux4

    https://mp.weixin.qq.com/s/hh0eExVFC6cxzpvNI1cA9A 使用门实现四选一选择器. 原理图 ​​ 参考链接 https://github.com/wjcdx/ ...

  6. Java实现蓝桥杯模拟空地长草

    问题描述 小明有一块空地,他将这块空地划分为 n 行 m 列的小块,每行和每列的长度都为 1. 小明选了其中的一些小块空地,种上了草,其他小块仍然保持是空地. 这些草长得很快,每个月,草都会向外长出一 ...

  7. Java实现 计蒜客 1251 仙岛求药

    仙岛求药 少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶.叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处.迷阵由 M \times NM× ...

  8. Java实现 蓝桥杯VIP 算法提高 促销购物

    算法提高 促销购物 时间限制:1.0s 内存限制:256.0MB 问题描述 张超来到了超市购物. 每个物品都有价格,正好赶上商店推出促销方案.就是把许多东西一起买更便宜(保证优惠方案一定比原价便宜). ...

  9. java实现多线程(车站卖票)

    import java.util.ArrayList; import java.util.List; public class 多线程 { // public static int j=0; publ ...

  10. 关于VMware虚拟机启动EFI/UEFI支持

    作为较新计算机和操作系统用于引导计算机的技术,可扩展固件接口 (EFI) 正在取代 BIOS.EFI 有时称为统一可扩展固件接口 (UEFI). 使用VMware创建虚拟机,默认还是会使用传统的BIO ...