数据结构之栈 相关操作算法

/********************************************
* 功能:实现与栈有关的操作,包括入栈和出栈
* 作者: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");
	}
} 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值