# 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 MVC 后台接受base64的上传图片

    #region 配合前端的多张图片上传 #region 上传图片方法 /// <summary> /// 接口方法 /// </summary> /// <param n ...

  2. NFS服务搭建与配置

    启动NFS SERVER之前,首先要启动RPC服务(CentOS5.8下为portmap服务,CentOS6.6下为rpcbind服务,下同),否则NFS SERVER就无法向RPC服务注册了.另外, ...

  3. 八皇后问题的Python实现和C#实现

    看到八皇后问题的解决思路, 感觉很喜欢. 我用C#实现的版本之前贴在了百度百科上(https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9 ...

  4. Web自动化

    # -*- coding:utf-8 -*- ''' Created on Oct 17, 2018 @author: SaShuangYiBing Comment: ''' from seleniu ...

  5. luogu P2000 拯救世界

    嘟嘟嘟 题目有点坑,要你求的多少大阵指的是召唤kkk的大阵数 * lzn的大阵数,不是相加. 看到这个限制条件,显然要用生成函数推一推. 比如第一个条件"金神石的块数必须是6的倍数" ...

  6. ActiveMQ安装配置及使用

    ActiveMQ介绍 ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管J ...

  7. ethereum/EIPs-1271 smart contract

    https://github.com/PhABC/EIPs/blob/is-valid-signature/EIPS/eip-1271.md Standard Signature Validation ...

  8. oracle 定期迁移分区表数据(不落地)

    [oracle@SJ ~]$ cat /home/oracle/JY_SJ.sh #!/bin/bashsource /home/oracle/.bash_profileSDATE=$(date  + ...

  9. 遗传算法MATLAB工具包简介

    下面介绍的函数都是Sheriffed大学遗传算法工具包内的常用函数 复制矩阵 B=rep(A,RepN) 1 A表示要被复制的矩阵,RepN包含每个方向的复制次数,RepN(1)代表纵向复制次数,Re ...

  10. MATLAB——神经网络init初始化函数和adapt函数