栈的链式存储结构及实现

对于链栈来说,由于栈顶放在链表的头部,所以对于链栈来说是不需要头节点的。

对于链栈来说,基本上不存在栈满的情况,除非内存已经没有可以使用的空间。对于空栈来说t->top=NULL;也就是相当于头指针指向空。

它的结构如下:

#ifndef   _linkstack_h
#define   _linkstack_h

#include<iostream>
#include<stdlib.h>

typedef struct stacknode//栈中的结点
{
	struct stacknode* next;

	int data;
}stacknode;

typedef struct linkstack
{
	stacknode* top;//栈顶指针

	int length;//用来记录栈中结点个数
}linkstack;

extern void initlinkstack(linkstack* s);
extern int pushlinkstack(linkstack* s, int value);
extern int poplinkstack(linkstack* s, int value);
extern void clearlinkstack(linkstack* s);
extern void printlinkstack(linkstack* s);
extern void destroylinkstack(linkstack* s);

#endif
#include"linkstack.h"

void initlinkstack(linkstack* s)//空栈初始化
{
	s->length = 0;

	s->top = NULL;
}

int pushlinkstack(linkstack* s,int value)//进栈不用判断栈为满的情况
{
	stacknode* l = NULL;

	l = (stacknode*)malloc(sizeof(stacknode));//栈的结点

	l->data = value;

	l->next = s->top;//把当前的栈顶指针地址赋给新结点的指针域

	s->top = l;//栈顶指针指向新的结点

	s->length++;//栈的结点个数加一

	return value;

}

int poplinkstack(linkstack* s, int value)//出栈
{
	stacknode* l = NULL;

	if (s->top == NULL||s->length==0)//栈里没有元素
	{
		return 0;
	}

	l = s->top;

	s->top = s->top->next;

	value = s->top->data;

	free(l);

	s->length--;

	return value;
}

void clearlinkstack(linkstack* s)//清空栈
{
	stacknode* p = NULL;

	p = s->top;

	while (p)
	{
		p = p->next;   //p = s->top->next;

		free(p);
	}
	return;
}

void destroylinkstack(linkstack* s)//销毁栈
{

	clearlinkstack(s);//先清空栈内元素

	free(s);//再释放栈顶指针

	s = NULL;

}

void printlinkstack(linkstack* s)//遍历栈
{
	int i = 0;

	while (s->top)
	{		
		printf("%d\t", s->top->data);//从第一个结点开始遍历

		s->top = s->top->next;

		i++;

		if (i == 8)
		{
			printf("\n");

			i = 0;
		}
	}

	printf("\n");

	return;
}
#include"linkstack.h"

int main(void)
{
	int i = 0;

	linkstack* s = NULL;

	s = (linkstack*)malloc(sizeof(linkstack));

	initlinkstack(s);

	for (i = 1; i <= 48; i++)
	{
		pushlinkstack(s,i);
	}

	printlinkstack(s);

	system("pause");

	return 0;
}

在这里插入图片描述
链栈的进栈和出栈都没有人和循环操作,时间复杂度为O(1),对比顺序栈和链栈,顺序栈要事先确定一个固定的长度,可能会存在内存空间浪费的问题,但它的优势是存取时定位很方便,而链栈则要求每个元素都要有指针域,这同时也增加了一些内存开销,但对于栈的长度无限制。如果栈的使用过程中元素不可预料,有时大有时小,那么最好用链栈,如果它的变化在可控范围内,建议使用顺序栈会更好一些。

发布了150 篇原创文章 · 获赞 81 · 访问量 6470

猜你喜欢

转载自blog.csdn.net/qq_38158479/article/details/104056648