# include <stdio.h>
# include <malloc.h>
# include <stdlib.h> typedef struct Node //建造节点
{
int data;
struct Node * pNext;
}NODE, * PNODE; typedef struct Stack //建造栈所需要的两个参数
{
PNODE pTop; //指向栈顶的元素
PNODE pBottom; //指向栈底没有实际含义的元素
}STACK, * PSTACK;// PSTACK 等价于 struct Stack * void init(PSTACK); //初始化
void push(PSTACK, int); //压栈
void traverse(PSTACK); //遍历输出
bool pop(PSTACK, int *); //出栈
void clear1(PSTACK); //清空
void clear2(PSTACK);//清空 int main(void)
{
STACK S; //STACK 等价于 struct Stack
int val; init(&S); //初始化 目的是造出一个空栈
push(&S, ); //压栈
push(&S, );
push(&S, );
push(&S, );
push(&S, );
push(&S, );
traverse(&S); //遍历输出 if ( pop(&S, &val) ) //出栈
{
printf("出栈成功!出栈的元素是:%d\n", val);
}
else
{
printf("出栈失败!\n");
} traverse(&S); //遍历输出 clear2(&S);
traverse(&S); //遍历输出 return ;
} void init(PSTACK pS) //初始化
{
pS->pTop = (PNODE)malloc(sizeof(NODE));
if (NULL == pS->pTop)
{
printf("动态内存分配失败!\n");
exit(-);
}
else
{
pS->pBottom = pS->pTop;
pS->pTop->pNext = NULL; //pS->pBottom->pNext = NULL;
}
} void push(PSTACK pS, int val) //压栈
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = pS->pTop; //不能把 pS->Top 改为 pS->pBottom
pS->pTop = pNew; return;
} void traverse(PSTACK pS) //便利输出
{
PNODE p = pS->pTop;
while (p != pS->pBottom)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\n"); return;
} bool empty(PSTACK pS) //判断是否空
{
if (pS->pTop == pS->pBottom)
{
return true;
}
else
{
return false;
}
} //把PS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败返回false,否则返回true
bool pop(PSTACK pS, int * pVal)
{
if ( empty(pS) ) // pS 形参本身保存的是 S 的地址,这里需要将S的地址发送给 empty() 函数只要发送 pS即可
{
return false;
}
else
{
PNODE r = pS->pTop; //需要把他定义成已 pS->pTop 为类型的地址变量
*pVal = pS->pTop->data; //等价于 r->data
pS->pTop = pS->pTop->pNext; //等价于 r->pNext
free(r); //这里释放的是r所指向的动态内存
r = NULL; //这里表示清空地址变量 r 的数据以便下次分配 return true;
}
} void clear2(PSTACK pS) //清空
{
PNODE p;
int i;
printf("清空的值都有:"); while ( pS->pTop != pS->pBottom )
{
p = pS->pTop;
i = p->data;
printf("%d ", i);
pS->pTop = p->pNext;
free(p);
p = NULL;
}
printf("\n"); i = NULL;
pS->pTop = pS->pBottom;
} void clear1(PSTACK pS) //清空
{
if ( empty(pS) )
{
return;
}
else
{
PNODE p = pS->pTop;
PNODE q = p->pNext; while (p != pS->pBottom)
{
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom;
} }

C_数据结构_栈的更多相关文章

  1. c_数据结构_栈的实现

    #include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100 #define STACKINCREMENT ...

  2. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_04 数据结构_1_数据结构_栈

    2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类 的.好用吗?好用,这就是数据结构的用处,只不过你在不知不 ...

  3. C#数据结构_栈和队列

    栈:先进后出,只能在栈顶进行操作. 栈的操作主要包括在栈顶插入元素和删除元素.取栈顶元素和判断栈是否为空等. 栈的接口定义: public interface IStack<T> { in ...

  4. c_数据结构_图_邻接表

    课程设计------邻接表 图的遍历实现课程设计:https://files.cnblogs.com/files/Vera-y/图的遍历_课程设计.zip #include<stdio.h> ...

  5. C_数据结构_链表的链式实现

    传统的链表不能实现数据和链表的分离,一旦数据改变则链表就不能用了,就要重新开发. 如上说示:外层是Teacher,里面小的是node. #ifndef _MYLINKLIST_H_ #define _ ...

  6. c_数据结构_队的实现

    # 链式存储#include<stdio.h> #include<stdlib.h> #define STACK_INIT_SIZE 100//存储空间初始分配量 #defin ...

  7. c_数据结构_链表

    #include<stdio.h> #include<stdlib.h> #define ERROR 0 #define OK 1 #define OVERFLOW -2 ty ...

  8. c_数据结构_顺序表

    #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量 #define ...

  9. C_数据结构_走迷宫

    #include <stdio.h> #include <conio.h> #include <windows.h> #include <time.h> ...

随机推荐

  1. .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)

    Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...

  2. 利用PCA进行故障监测

    利用PCA进行故障监测,传统的统计指标有两种:Hotelling-T2和平方预测误差(Squared prediction error, SPE).T2统计量反映了每个主成分在变化趋势和幅值上偏离模型 ...

  3. VSCode + PYQT5 + QtDesigner 环境搭建和测试

    目的:编写Python桌面应用程序. 备注:也可以选择VS2017+QtDesigner ,但更喜欢VSCode 第1步:安装PyQt5和PyQt5-tools pip3 install -i htt ...

  4. python之面向对象进阶3

    1.isinstace和issubclass 2.staticmethod和classmethod 3.反射(hasattr.getattr.setattr.delattr等四个方法) 4.内置方法 ...

  5. Django之知识总结

    1. 课程介绍 - 数据类型 - 函数 - 面向对象三大特性:继承,封装,多态 - socket:本质传输字节:所有网络通信都基于socket - 数据库设计:单表.FK.M2M (自己作业:自己领域 ...

  6. P1057 传球游戏

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的: nnn 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球 ...

  7. 快速对Mysql添加索引的五个方法

    1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引 ...

  8. .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别

    前段时日微软(Microsoft)正式发布了.NET Core 2.0,在很多开发社区中反响不错.但还是有一些开发者发出了疑问,.NET Core.Xamarin..NET Standard和.NET ...

  9. Bug 14143011 : ORA-19606: CANNOT COPY OR RESTORE TO SNAPSHOT CONTROL FILE

    Bug 14143011 : ORA-19606: CANNOT COPY OR RESTORE TO SNAPSHOT CONTROL FILE [oracle@test]$ tail -f rma ...

  10. 遇到的web请求错误码集合与解释

    302 临时移动.与301类似.但资源只是临时被移动.客户端应继续使用原有URI