动态栈 数据结构 C语言实现

动态栈本质上就是一个操作受限的链表。

栈的结构由两部分组成,一个是包含了顶部指针和底部指针的结构体

另一个就是链表

顶部指针(p->pNext)指向的是栈顶的有效结点,底部指针指向的是头结点(数据域不存放有效数据)

此链表和普通的单链表不同的是为了更好地实现栈地各种操作,我们是由栈顶元素以此指向栈底元素。

下面代码包括了初始化,入栈,出栈,遍历,判断是否为空,和返回有效长度的操作。

#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);//栈初始化 

void en_stack(PSTACK,int);//入栈 

void out_stack(PSTACK);//出栈 

int isempty(PSTACK );//判断是否为空 

int len(PSTACK);//返回栈的长度 

void traverse(PSTACK);//遍历 

int main(void)
{
	STACK st;
	init_stack(&st);
	en_stack(&st,1);
	en_stack(&st,2);
	en_stack(&st,3);
	en_stack(&st,4);
	en_stack(&st,6);
	traverse(&st);
	printf("%d\n",len(&st));
	out_stack(&st);
	traverse(&st);
}

void init_stack(PSTACK st)
{
	st->pBottom = (PNODE)malloc(sizeof(NODE));//栈的底指针指向栈底元素(头节点)
	if(st->pBottom == NULL)
	{
		printf("分配内存失败\n");
		exit(-1);
	}
	else
	{
	st->pTop = st->pBottom;
	st->pTop->pNext = NULL;
	}
}
void en_stack(PSTACK st,int val)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	if(pNew == NULL)
	{
		printf("分配内存失败\n");
		exit(-1);
	}
	else
	{
		pNew->pNext=st->pTop;
		st->pTop = pNew;
		st->pTop->data = val;
	}
}
void out_stack(PSTACK st)
{
	if(isempty(st))
	{
		printf("此栈为空无法出栈!\n");
	}
	PNODE p = st->pTop;
	st->pTop = st->pTop->pNext;	
	free(p);
} 

int isempty(PSTACK st)
{
	if(st->pTop == st->pBottom)
	{
		return 1;
	}
	else
	{
		return 0;
	 } 
}

int len(PSTACK st)
{
	int len = 0;
	PNODE p = st->pTop;
	while(p->pNext != NULL)
	{
		len++;
		p = p->pNext;
	}
	return len;
}
void traverse(PSTACK st)
{
	PNODE p = st->pTop;
	while(p->pNext!=NULL)
	{
		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、付费专栏及课程。

余额充值