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. PSR-4 的实现示例

    闭包实例 <?php /** * 一个具体项目实现的示例. * * 在注册自动加载函数后,下面这行代码将引发程序 * 尝试从 /path/to/project/src/Baz/Qux.php * ...

  2. 【Python】基础总结

    输入 input("提示性信息") 如: input("请输入数字") 评估函数 因为 Python 没有特别人为规定数据类型,数据类型是由计算机进行判定,所以 ...

  3. day1_计算机基础

    一.计算器5大组成:计算机硬件:(计算机是奴隶)         1.五大组成             控制器             运算器             存储器I/O:内存+外存     ...

  4. Chisel3 - Tutorial - FullAdder

    https://mp.weixin.qq.com/s/Aye-SrUUuIP6_o67Rlt5OQ   全加器   逻辑图如下: ​​   参考链接: https://github.com/ucb-b ...

  5. java方法句柄-----2.方法句柄的获取、变换、特殊方法句柄

    目录 1.获取方法句柄 1.1查找构造方法.一般方法和静态方法的方法句柄 1.2 查找类中的特殊方法(类中的私有方法) 1.3 查找类中静态域和一般域 1.4 通过反射API得到的Constructo ...

  6. ASP.NET的Web网页如何进行分页操作(Demo举例)

    大概说一下思路,可以利用sql的 Offset/Fetch Next分页,点击这里 这里的Demo利用LINQ的写好的方法 //这里是某个表的列表 skip是跳过前面的多少条数据 take这是跳过前面 ...

  7. Java实现 LeetCode 836 矩形重叠(暴力)

    836. 矩形重叠 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标. 如果相交的面积为正,则称两矩形重叠.需要明确的 ...

  8. Java实现 蓝桥杯 算法提高 摩尔斯电码

    算法提高 9-3摩尔斯电码 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 摩尔斯电码破译.类似于乔林教材第213页的例6.5,要求输入摩尔斯码,返回英文.请不要使用"zy ...

  9. Java实现 蓝桥杯VIP 算法训练 水仙花数

    这道题有两个方法,第一个就相对来说通俗易懂 第二个可以用到Java的一些方法 public class 水仙花数1 { public static void main(String[] args) { ...

  10. Java实现 蓝桥杯VIP 算法训练 sign函数

    试题 算法训练 sign函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定实数x,输出sign(x)的值. sign(x)是符号函数,如果x>0,则返回1:如果x=0, ...