/********************************************
* 功能:实现与栈有关的操作,包括入栈和出栈
* 作者:khq
* 时间:2020.4.15
*********************************************/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义节点,需要两个参数
typedef struct Node{
int data; //数据域
struct Node *pNext; //指针域
}NODE,*PNODE;
//定义栈,两个参数
typedef struct Stack{
PNODE pTop; //指向栈顶的有效节点
PNODE pBottom; //指向栈底的最后一个有效节点的下一个节点,类似于链表的头结点
}STACK,*PSTACK;
//方法声明
void init_Stack(PSTACK); //初始化栈,目的是让pTop和pBottm都指向不存放有效数据的头结点
void push(PSTACK,int); //入栈,将元素压入栈,pTop上移
bool pop(PSTACK,int*); //出栈,并将待出栈的节点的数据交给int*
bool is_empty(PSTACK); //判断栈是否为空
void clear(PSTACK); //清空栈中的数据
void traverse(PSTACK); //遍历栈中的数据
int main(void){
STACK ps;
init_Stack(&ps); //栈的初始化
push(&ps,1); //压栈
push(&ps,2);
push(&ps,3);
push(&ps,4);
push(&ps,5);
push(&ps,6);
traverse(&ps); //遍历栈中节点的值
int val;
if(pop(&ps,&val)){
printf("出栈成功,出栈的节点的值为%d\n",val);
}else{
printf("出栈失败!\n");
}
traverse(&ps);
clear(&ps); //清空栈
traverse(&ps);
return 0;
}
//初始化栈,目的是让pTop和pBottm都指向不存放有效数据的头结点
void init_Stack(PSTACK pck){
pck->pBottom = (PNODE)malloc(sizeof(PNODE));
if(pck->pBottom==NULL){
printf("动态内存分配失败!\n");
exit(-1);
}else{
pck->pTop = pck->pBottom;
pck->pBottom->pNext = NULL;
}
}
//入栈,将元素压入栈,pTop上移
void push(PSTACK pck,int value){
PNODE pNew = (PNODE)malloc(sizeof(PNODE)); //先创建一个新的节点
pNew ->data = value; //将值存到新节点的数据域
pNew->pNext = pck->pTop; //让新的节点指向pTop
pck->pTop = pNew;
}
//判断栈是否为空
bool is_empty(PSTACK pck){
if(pck->pTop == pck->pBottom){
return true;
}else{
return false;
}
}
//出栈,并将待出栈的节点的数据交给e
bool pop(PSTACK pck,int *e){
if(is_empty(pck)){
return false;
}else{
PNODE r = (PNODE)malloc(sizeof(PNODE));
r = pck->pTop;
*e = r->data;
pck->pTop = r->pNext;
free(r); //把这段空间释放掉后,会提示DEMAGE问题
r = NULL;
return true;
}
}
//清空栈中的数据
void clear(PSTACK pck){
if(is_empty(pck)){
printf("栈已空,无需清空!......");
exit(-1);
}else{
PNODE p = pck->pTop;
PNODE q = NULL;
while(p!=pck->pBottom){
q = p->pNext;
free(p);
p = q;
}
pck->pTop = pck->pBottom;
}
}
//遍历栈中的数据
void traverse(PSTACK pck){
if(is_empty(pck)){
printf("栈已空,不能遍历!......\n");
exit(-1);
}else{
PNODE p = pck->pTop;;
while(p!=pck->pBottom){
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}
}
数据结构之栈 相关操作算法
最新推荐文章于 2021-08-18 17:35:06 发布