C语言用链表实现一个栈

目前在学数据结构,所以就相当于做笔记了,希望对大家有帮助。

栈大家都很熟悉,这里就不啰嗦了。

在头文件中关于栈和链表的定义,整个的链表是LinkStack, 里面存储的元素top就是节点,这样分开存的好处是方便理解和后期修改

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct LNode{
	int data;  // 栈的数据 
	LNode* next; // 指向下一个节点 
};

struct LinkStack{
	LNode* top;
	int len;  // 存储栈的长度 
	int maxlen;  // 栈的最大长度 
}; 

创建一个栈,值得注意的是len之必须提前赋为-1,保证我们的maxlen数值准确,防止出现最大值是5,但是实际上只能存4个节点的情况

// 创建一个栈 
LinkStack* Create(int maxlen){
	LinkStack* ls = (LinkStack*)malloc(sizeof(LinkStack));
	ls->top = NULL;
	ls->len = -1;
	ls->maxlen = maxlen;
	return ls;
}

将栈置空,直接把len修改即可,这里(偷懒)就不free了。

// 将栈置空 
void FreeAll(LinkStack* ls){
	ls->len = -1;
} 

断栈是否为空

// 判断栈是否为空 
bool IsEmpty(LinkStack* ls){
	return ls->len <= 0;
} 

判断栈是否已满

// 判断栈是否已满
bool IsFull(LinkStack* ls){
	return ls->len == ls->maxlen;
} 

将数据入栈,需要注意一定是头插法,栈只有一个入口

// 将x压入栈
bool push(LinkStack* ls, int x){
	if(IsFull(ls)){
		printf("栈已满!");
		return false;
	}
	LNode* newNode = (LNode*)malloc(sizeof(LNode));
	newNode->data = x;
	newNode->next = ls->top;
	ls->top = newNode;
	ls->len++;
	return true;
}

将栈顶元素出栈,不能提供中间删除的方法,因为栈只有一个出口

// 将栈顶元素出栈
bool pop(LinkStack* ls){
	if(IsEmpty(ls)){
		printf("栈为空!"); 
		return false;
	}
	LNode* tool = ls->top;
	ls->top = tool->next;
	ls->len--;
	return true;
} 

获取栈顶元素,这个方法可以和出栈写在一起,即出栈的时候顺便获取这个元素值

// 获取栈顶元素
int getTop(LinkStack* ls){
	return ls->top->data;
}

打印栈内的所有元素,限于单链表的原因,这里只能反过来打印,即从栈顶打印到栈底。也可以把链表换成双链表

// 打印栈的所有元素
void printAll(LinkStack* ls){
	LNode* tool = ls->top;
	while(tool){
		printf("%d  ", tool->data);
		tool = tool->next;
	}
}

最后的主函数,简单测试一下。

int main(){
	int i = 0, n = 0;
	LinkStack* ls = Create(5);
	while(i < 7){
		scanf("%d", &n);
		if(!push(ls,n)){
			break;
		}
		i++;
	}
	printf("\n");
	pop(ls);
	printAll(ls);
	return 0;
}

有什么问题可以直接私信我呀~~~~~

希望和诸君共勉

猜你喜欢

转载自blog.csdn.net/qq_61567032/article/details/126817888