栈是一种只允许在一端进行插入或删除操作的线性表,它是一种特殊的线性表,它与队列具有相同的逻辑结构,都属于线性结构,区别在于对其中元素的处理不同,栈遵循的原则是先进后出(FILO),即后进的元素先被取出来,它是被限制存取点的线性结构。由于它是一种线性表,所以有两种方式:顺序存储结构和链式存储结构,即顺序栈和链式栈
栈的链式结构
栈先进后出,是一个特殊的线性表,只能在一端进行操作
1、初始化栈
2、出栈
3、入栈
4、判断栈是否为空
入栈
我们入栈的顺序是1,2,3,4,5,和头插法一样
出栈(移除只能移除栈顶的也就是头节点)
5,4,3,2,1的顺序出去
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node* next;
}; Node;
Node* initStack() {
Node* S = (Node*)malloc(sizeof(Node));//开辟一个栈的节点
S->data = 0;
S->next = NULL;
return S;//返回栈的指针
}
//判断栈是否为空
int isEmpty(Node* S) {
//头节点下一个是null就是空的栈
if (S->data == 0 || S->next == NULL) {
return 1;//函数执行失败
}
else {
return 0;//函数正常退出
}
}
//出栈
int pop(Node* S) {
if (isEmpty(S)) {
return -1;//非正常运行
}
else {
Node* node = S->next;//node指针指向栈的第二个节点
int data = node->data;//将要移除的节点的数据存起来
S->next = node->next;//栈第一个节点的指针指向第二个节点
free(node);//释放空间
return data;
}
}
//入栈,头插法s被顶到最上面去了
void push(Node* S, int data) {
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
//node插入到s与s—>next节点之间
node->next = S->next;
S->next = node; //头节点指向新节点
S->data++;//栈里面多了一个节点
}
//遍历栈
void printStack(Node* S) {
Node* node = S->next;
while (node) {
printf("%d ->", node->data);
node = node->next;
}
printf("NULL");
}
int main(void) {
Node* S = initStack();
/* push(S, 1);
push(S, 2);
push(S, 3);
push(S, 4);
push(S, 5);*/
printStack(S);
return 0;
}