数据结构 考研复试 突击
数据结构 备考第二天😂
关于栈
- 先进后出
- 常用于 验证 符号成对出现
概述
- 初始化栈,分配一个stack地址空间,stack指针指向一个空地址。
- 压栈,stack的next指针指向栈顶元素,可以理解为链表的头插法。
- 出栈,弹出的也是栈顶元素,
附上代码
#include <stdio.h>
#include <stdlib.h>
typedef int Data;
typedef struct Node
{
Data data; // 整形数据元素
struct Node *next; // 下一指针域
}Stack;
Stack* init_stack() // 初始化栈
{
Stack *stack = (Stack*)malloc(sizeof(Stack));
if(stack != NULL)
{
stack->next = NULL; // 头节点 指向 空指针
return stack;
}
printf("无法分配内存!");
return NULL;
}
int is_empty(Stack *stack) // 判空
{
return stack->next == NULL; // 栈底指针 为空,即栈为空
}
// 入栈
// 1 压栈 成功
// 0 压栈 失败
int push_stack(Stack *stack, Data data)
{
Stack *push = (Stack*)malloc(sizeof(Stack));
if(push != NULL)
{
push->data = data;
push->next = stack->next; // 新节点 插入至 栈顶
stack->next = push; // stack 指向 栈顶
return 1;
}
printf("无法分配内存\n");
return 0;
}
// 出栈
// 1 出栈 成功
// 0 出栈 失败
int pop_stack(Stack *stack)
{
Stack *temp; // 指向 待弹出
if(!is_empty(stack))
{
temp = stack->next; // temp为栈顶 元素
stack->next = temp->next; // stack指针 指向 temp的下一节点
free(temp); // 释放 栈顶元素
temp = NULL; // 防止 野指针
return 1;
}
else
{
return 0;
}
}
// 取栈顶元素的值
void get_pop_elem(Stack *stack)
{
if(!is_empty(stack))
{
printf("%d ", stack->next->data);
}
else{
printf("栈为空");
}
}
// 清空栈
void empty_stack(Stack *stack)
{
while(!is_empty(stack))
{
pop_stack(stack);
}
printf("完成清空栈\n");
}
void destory_stack(Stack *stack) // 销毁栈
{
free(stack);
stack = NULL;
printf("栈已被销毁\n");
}
// 显示栈的所有 元素
void show_stack(Stack *stack)
{
Stack *temp = stack; // 辅助 指针
while (!is_empty(temp)) // 判断下个 节点 是否为空
{
temp = temp->next;
printf("%d ", temp->data);
}
printf("\n");
}
int main() // 主函数
{
// 初始化 栈
Stack *stack = init_stack();
// 入栈
push_stack(stack, 1);
push_stack(stack, 2);
push_stack(stack, 3);
push_stack(stack, 4);
push_stack(stack, 5);
show_stack(stack);
// 出栈
pop_stack(stack);
pop_stack(stack);
show_stack(stack);
//获取栈顶元素
get_pop_elem(stack);
// 清空栈
empty_stack(stack);
// 销毁栈
destory_stack(stack);
getchar();
return 0;
}
欢迎小伙伴们 评论😃