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. word修改页眉使本页的页眉与别的页不一样

    关键回答:双击要修改的页的页眉,word顶端的工具栏“页面设置”当中的“链接到前一个”选项不要选中,即可修改本页页眉使之与别的页不一样. 详见:https://iask.sina.com.cn/b/2 ...

  2. web-信息泄露基础知识总结(持续更新)

    web-信息泄露 1.git泄露 Git是一个开源的分布式版本控制系统,在执行git init初始化目录的时候,会在当前目录下自动创建一个.git目录,用来记录代码的变更记录等.发布代码的时候,如果没 ...

  3. Chisel3-Intellij IDEA中使用sbt构建Chisel项目

    https://mp.weixin.qq.com/s/gssjiiPW6zUzKwCFZdNduw   1. 使用Intellij IDEA创建Scala项目   Chisel项目,就是构建Scala ...

  4. 空格与false

  5. CSS选择器有哪些?哪些属性可以继承?

    CSS选择符: id选择器(#myid). 类选择器(.myclassname). 标签选择器(div, h1, p). 相邻选择器(h1 + p). 子选择器(ul > li). 后代选择器( ...

  6. MyBatis特性详解

    缓存简介 一般我们在系统中使用缓存技术是为了提升数据查询的效率.当我们从数据库中查询到一批数据后将其放入到混存中(简单理解就是一块内存区域),下次再查询相同数据的时候就直接从缓存中获取数据就行了. 这 ...

  7. Java实现 LeetCode 676 实现一个魔法字典(暴力)

    676. 实现一个魔法字典 实现一个带有buildDict, 以及 search方法的魔法字典. 对于buildDict方法,你将被给定一串不重复的单词来构建一个字典. 对于search方法,你将被给 ...

  8. Java实现 LeetCode 565 数组嵌套(没有重复值的数组)

    565. 数组嵌套 索引从0开始长度为N的数组A,包含0到N - 1的所有整数.找到并返回最大的集合S,S[i] = {A[i], A[A[i]], A[A[A[i]]], - }且遵守以下的规则. ...

  9. Java实现 洛谷 P1980 计数问题

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = ...

  10. python3 后台维护软件

    后台维护软件 一.思路: 登录: 1.用户登录(编写GUI用户登录界面) 使用模块:tkinter,pymssql 验证逻辑: 1.获取文本框输入数据. 2.进行空值值判断 if ...else... ...