【菜鸟er】C语言数据结构_动态栈应用

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
//#include <bits/stdc++.h>
//using namespace std;

//链表定义
typedef struct node{
    int data;
    struct node * pnext;
}NODE,*PNODE;

typedef struct stack{
	PNODE ptop;
	PNODE pbottom;
}STACK,* PSTACK;
//初始化栈
void init_stack(PSTACK ps);
//压栈
void push_stack(PSTACK ps,int val);
//遍历
void traverse_stack(PSTACK ps);
//出栈
bool pop_stack(PSTACK ps,int * pval);
//判断空
bool empty_stack(PSTACK ps);
//清空
void clear_stack(PSTACK ps);

int main()
{
	STACK s;
	init_stack(&s);

	push_stack(&s,1);
	push_stack(&s,2);
	push_stack(&s,3);
	push_stack(&s,4);
	push_stack(&s,5);
	push_stack(&s,6);

	int num=0;
	pop_stack(&s,&num);

	traverse_stack(&s);

	clear_stack(&s);
	traverse_stack(&s);


	return 0;
}

void init_stack(PSTACK ps)
{
	ps->ptop = (PNODE)malloc(sizeof(NODE));
	if(NULL == ps->ptop){
		printf("error!\n");
		exit(-1);
	}
	else
	{
		ps->pbottom = ps->ptop;
		ps->ptop->pnext = NULL;//初始化指向的那个空栈的指针域为null
	}
}

void push_stack(PSTACK ps,int val)
{
	PNODE pnew = (PNODE)malloc(sizeof(NODE));
	//完成pnew的制作
	pnew->data = val;
	pnew->pnext = ps->ptop;
	//指向pnew;
	ps->ptop = pnew;
}

bool empty_stack(PSTACK ps)
{
	if(ps->ptop == ps->pbottom)	return true;
	return false;
}

void traverse_stack(PSTACK ps)
{
	PNODE p = ps->ptop;
	while(p != ps->pbottom){
		printf("%d ",p->data);
		p = p->pnext;
	}
	return;
}

bool pop_stack(PSTACK ps,int * pval)
{
	//出栈数据存入pval所指向的变量
	if(empty_stack(ps))	return false;

	PNODE r = ps->ptop;
	ps->ptop = r->pnext;

	free(r);
	r = NULL;
}

void clear_stack(PSTACK ps)
{
	if(empty_stack(ps))	return;

	PNODE p = ps->ptop;//指向第一个
	PNODE q = p->pnext;//指向第二个

	while(p!=ps->pbottom){
		q = p->pnext;
		free(p);
		p = q;
	}
	ps->ptop = ps->pbottom;

}

猜你喜欢

转载自blog.csdn.net/f_zmmfs/article/details/79978661
今日推荐