数据结构与算法----栈
简单来说,栈就相当于与有一堆扑克牌,只能在最顶上放牌,也只能在最顶上拿牌
所以说栈的操作实际上是对最顶端数据的操作
实现栈操作可以使用顺序表,也可以使用链表
顺序表
我们需要一个额外的变量来记录栈顶的位置,这样才能更加方便的进行操作
初始化栈
struct Stack{
int * array; //数组
int capacity; //容量
int top; //栈顶索引
};
void InitStack(struct Stack* stack){
stack->array = (int*)malloc(sizeof(int) * 10); //初始时分配内存
if(stack->array == NULL) return 0; //分配失败结束
stack->capacity = 10;
stack->top = -1; //默认初始时栈顶为-1
}
插入元素
void Insertstack(struct Stack* stack , int element){ //不需要输入索引值,因为只会对栈顶操作
if(stack->top + 1 == stack->capacity){ //如果栈已经满了,重新分配内存
int* NewArray = (int*)realloc(stack->array , sizeof(int)*(stack->capacity + 10));
if(NewArray == NULL) return 0;
stack->array = NewArray;
stack->capacity = stack->capacity + 10;
}
stack->array[stack->top + 1] = element; //存入元素
stack->top++; //栈顶自增
}
删除元素
void Deletestack(struct Stack* stack){
if(stack->top == -1) return 0; //如果元素已经没了,那么直接返回
stack->top--; //直接让栈顶索引减1就好了
}
打印栈
void Printstack(struct Stack* stack){
for(int temp = 0 ; temp <= stack->top ; temp++){
printf("%d ",stack->array[temp]);
}
printf("\n");
}
链表
初始化栈
struct StackNode{
int element;
struct StackNode* next;
};
void InitStack(struct StackNode* head){
head->next = NULL; //默认下一结点为空
}
插入元素
void InsertStack(struct StackNode* head , int element){
struct StackNode* temp = (struct StackNode*)malloc(sizeof(struct StackNode));
if(temp == NULL) return 0;
struct StackNode* remem = head->next ;
head->next = temp;
temp->element = element;
temp->next = remem;
}
删除元素
void DeleteStack(struct StackNode* head){
struct StackNode* temp = head->next;
head->next = head->next->next;
free(temp);
}
打印栈
void PrintStack(struct StackNode* head){
while(head->next != NULL){
printf("%d ",head->next->element);
head = head->next;
}
printf("\n");
}