目前在学数据结构,所以就相当于做笔记了,希望对大家有帮助。
栈大家都很熟悉,这里就不啰嗦了。
在头文件中关于栈和链表的定义,整个的链表是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;
}
有什么问题可以直接私信我呀~~~~~
希望和诸君共勉