用顺序表实现栈的基本操作
栈的操作包括初始化栈,入栈,出栈,判空,销毁栈,获取栈的长度,获取栈顶元素。
在C语言中,首先引用头文件
#include<stdio.h> #include<stdlib.h> #include<stdbool.h>接下来是栈的结构体定义
typedef struct Stack{ int *data; int top; int init_capacity;}Stack;data指针指向第一个元素的位置,top指的是栈顶元素的下标,init_capacity指的是栈的容量。
初始化栈
Stack *create_stack(int init_capacity){ Stack *stack=(Stack *)malloc(sizeof(Stack)); if(!stack){ printf("malloc fail"); exit(1);} stack->data=(int *)malloc(init_capacity*sizeof(int)); if(!stack->data){ printf("malloc fail"); exit(1);} stack->init_capacity=init_capacity; stack->top=-1; return stack;}判空
bool is_empty(Stack *stack){ return !stack||stack->top==-1;}获取栈中元素的个数
int size(Stack *stack){ return !stack?0:stack->top+1;获取栈顶元素(不出栈)
bool peek(Stack *stack, int *val){ if(!stack || is_empty(stack)){ printf("错误:栈为空或指针无效\n"); return false; // 返回false,程序不终止 } *val = stack->data[stack->top]; return true; // 返回true表示成功 }入栈
void push(Stack *stack,int value){ if(!stack){ return;} if (stack->top == stack->init_capacity - 1) { stack->init_capacity *= 2; stack->data = (int*)realloc(stack->data, stack->init_capacity * sizeof(int)); if (!stack->data) { perror("realloc failed"); exit(EXIT_FAILURE);}} stack->data[++stack->top]=value;}入栈操作时,如果栈满的话,可以直接返回,也可以在代码中重新申请空间扩容。
出栈
int pop(Stack *stack){ if(!stack||is_empty(stack)){ exit(1);} return stack->data[stack->top--];}销毁栈
void destroy_stack(Stack *stack){ if(stack){ free(stack->data); free(stack);}}exit()与return
| 特性 | return | exit() |
|---|---|---|
| 作用对象 | 仅作用于当前函数 | 作用于整个程序 |
| 执行结果 | 返回到函数调用处,程序继续执行 | 直接终止整个程序,退出到操作系统 |
| 清理行为 | 仅清理当前函数的局部变量 | 会执行注册的清理函数(如atexit)、刷新缓冲区、关闭文件描述符等 |
| 返回值意义 | 返回给调用者(可以是任意类型) | 返回给操作系统(0 = 成功,非 0 = 失败) |
| 头文件 | 无需额外头文件 | 需要#include <stdlib.h> |
