1.栈
栈(Stack)是一种线性存储结构,它具有如下特点:
栈中的数据元素遵守先进后出(First In Last Out)的原则。
栈被限定只能在栈顶进行插入与删除操作。
标注的栈包括以下5个操作:
a,将某元素 添加到栈
b。取出栈顶 元素 (取出不删除)
c 弹出 栈顶元素 (删除的意思)
d。判断 栈是否为空
e。求栈存储元素个数
上面的五个操作是o(1)的复杂度,和栈的元素数目没有关系。
2.链表实现栈
使用链表实现栈,将 链表头节点 变成栈顶元素,所有栈操作变为基于 链表头节点 的操作。
3、栈的基本操作,入栈操作
如图上所示意思。入栈操作,将某元素添加至栈中:
a。 新建 节点,做相应赋值。
b。将新节点的 next指针指向当前 栈顶元素。
c。将新节点设置为栈顶节点。
d。修改栈中元素个数
代码:
就算是空栈也是可以的啦!
4.出栈操作
代码:
5.栈的其他基本操作
6.栈的基本操作,代码测试。
#include "malloc.h"
#include <stdio.h>
// 单链表的数据结构
typedef struct ListNode ListNode;
struct ListNode {
int data;
ListNode *next;
};
typedef struct Stack Stack;
struct Stack {
ListNode *top_node;//栈顶元素的指针
int size; //栈中元素个数
};
//入栈
void stsck_push(Stack *stack, int val) {
ListNode *new_node = (ListNode*)malloc(sizeof(ListNode));
new_node->data = val;
new_node->next = stack->top_node;
stack->top_node = new_node;
stack->size += 1;
}
//出栈
void stack_pop(Stack *stack) {
if (!stack->top_node) { //判断栈是否为空
return;
}
ListNode *top_node = stack->top_node; //备份栈顶指针指向的节点地址
stack->top_node = stack->top_node->next;//这句不会写呀 修改栈顶指针,使其指向栈顶下方的元素
stack->size -= 1; // 修改栈中元素个数
free(top_node); // 释放原栈顶节点
}
//返回栈顶元素,将栈顶元素输出返回
int stack_top(Stack* stack) {
return stack->top_node->data;
}
// 返回栈的大小,返回栈中有多少个元素
int stack_size(Stack *stack) {
return stack->size;
}
// 判断栈是否为空,是否栈为空
int stack_is_empty(Stack *stack) {
return stack->top_node == NULL;
}
//打印
void stack_print(Stack * stack){
printf("Stack:\n");
ListNode *p = stack->top_node;
while (p) {
printf("[%d]\n", p->data);
p = p->next;
}
}
int main() {
Stack stack;
stack.top_node = NULL;
stack.size = 0;
stsck_push(&stack, 4);
stsck_push(&stack, 5);
stsck_push(&stack, 6);
stack_print(&stack);
printf("Stack Top value is %d\n", stack_top(&stack));
printf("Stack size is %d\n", stack_size(&stack));
printf("Stack empty is %d\n", stack_is_empty(&stack));
printf("\n");
stack_pop(&stack);
stack_pop(&stack);
stack_print(&stack);
printf("Stack Top value is %d\n", stack_top(&stack));
printf("Stack size is %d\n", stack_size(&stack));
printf("Stack empty is %d\n", stack_is_empty(&stack));
printf("\n");
stack_pop(&stack);
stack_print(&stack);
printf("Stack size is %d\n", stack_size(&stack));
printf("Stack empty is %d\n", stack_is_empty(&stack));
return 0;
}
划横线的地方 大家注意啦,我上面的代码截图中有些写错啦,所以在这完整的代码中给着重标出来了,大家也注意了啊!!不会写的地方也要多揣摩,弄明白。