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配置的方式最初被创建出来就是为了让配置与程序员无关.可是最终我们发现,绝大多数的那些配置 ...
随机推荐
- SET运算符
-- SET操作符: -- union 联合去重 两个表的字段个数和类型都得一样,起别名 应该在第一个表上操作,,排序按照第一列从小到大来排的 select employee_id, depart ...
- 【MOOC操作系统】测试题大题-进程调度 先入先服务算法例题 【某多道程序系统供用户使用的主存为100K,磁带机2台,打印机1台,采用可变分区存储管理,静态方式分配外围设备(进程获得所需全部设备才能进入内容),忽略用户作业的I/O时间。采用动态分区、首次匹配法(从低地址区开始)分配主存,一个作业创建一个进程,且运行中不紧缩内存。作业调度采用FCFS算法,在主存中的进程采用剩余时间最短调度算法。】
分析图: 答案: (1) 8 : 00作业1到达,占有资源并调入主存运行. 8: 20作业2和3同时到达,但作业2因分不到打印机,只能在后备队列等待.作业3资源满足,可进主存运行,并与作业1平分CPU ...
- 利用Nginx设置跨域的方式
1.服务端可控,添加响应头 2.服务端不可控.通过Nginx反向代理 3.服务端不可控.通过Nginx反向代理添加响应头 第一种方法.服务端可控时,可以在服务器端添加响应头(前端+后端解决) 浏览器地 ...
- Rocket - interrupts - Nodes
https://mp.weixin.qq.com/s/BlW4y0Ez1kppxvSHAla31A 简单介绍interrupts相关的diplomacy节点. 1. IntImp 中断节点实现: 1) ...
- Java实现 LeetCode 516 最长回文子序列
516. 最长回文子序列 给定一个字符串s,找到其中最长的回文子序列.可以假设s的最大长度为1000. 示例 1: 输入: "bbbab" 输出: 4 一个可能的最长回文子序列为 ...
- Java实现 LeetCode 313 超级丑数
313. 超级丑数 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7, ...
- java实现第七届蓝桥杯机器人塔
机器人塔 X星球的机器人表演拉拉队有两种服装,A和B. 他们这次表演的是搭机器人塔. 类似: A B B A B A A A B B B B B A B A B A B B A 队内的组塔规则是: A ...
- 洛谷 P1115 最大子序和
**原题链接** ##题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. **解法**: 1.暴力枚举 时间:O(n^3) 2.简单优化 时间:O(n ...
- 容器技术之Docker私有镜像仓库docker-distribution
在前边的博客中我们说到docker的架构由docker客户端.服务端以及仓库组成:docker仓库就是用来存放镜像的地方:其实docker registry我们理解为存放docker镜像仓库的仓库比较 ...
- 介绍几种给你的Python代码加上酷炫的进度条的方式
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 大家好,在下载某些文件的时候你一定会不时盯着进度条,在写代码的时候使用进度 ...