思维导图
链式栈
源文件
#include "05.h"
//创建链式栈
ChainStackPtr stack_create(){
ChainStackPtr S = (ChainStackPtr)malloc(sizeof(ChainStack));
if(NULL == S){
printf("创建失败\n");
return NULL;
}
NodePtr p = (NodePtr)malloc(sizeof(Node));
//初始化头结点
p->len = 0;
p->next = NULL;
S->bot = S->top = p; //栈顶栈底都为p
printf("创建成功\n");
return S;
}
//判空
int stack_empty(ChainStackPtr S){
if(NULL == S){
printf("操作不合法\n");
return -1;
}
return S->top == S->bot; //栈顶栈底相同时为空
}
//入栈
int stack_push(ChainStackPtr S,datatype e){
if(NULL == S){
printf("操作不合法\n");
return -1;
}
NodePtr p = (NodePtr)malloc(sizeof(Node));
//入栈元素初始化
p->data = e;
p->next = S->top;
//更新栈顶
S->top = p;
//链表的变化
S->bot->len++;
printf("%-3d入栈成功\n",e);
return 1;
}
//出栈
int stack_pop(ChainStackPtr S){
if(NULL == S || stack_empty(S)){
printf("操作不合法\n");
return -1;
}
//临时结点存放栈顶
NodePtr temp = S->top;
printf("%-3d出栈成功\n",temp->data);
//更新栈顶
S->top = S->top->next;
//链表的变化
S->bot->len--;
//释放临时结点
free(temp);
temp = NULL;
return 1;
}
//遍历
void stack_show(ChainStackPtr S){
if(NULL == S || stack_empty(S)){
printf("操作不合法\n");
return;
}
NodePtr q = S->top;
printf("当前链式栈有以下元素:");
while(q != S->bot){
printf("%-3d",q->data);
q = q->next;
}
printf("\n");
}
//获取栈顶元素
int stack_value_top(ChainStackPtr S){
if(NULL == S || stack_empty(S)){
printf("操作不合法\n");
return -1;
}
return S->top->data;
}
//销毁
void stack_free(ChainStackPtr S){
if(NULL == S){
printf("操作不合法\n");
return;
}
while(!stack_empty(S)){
stack_pop(S);
}
//释放栈顶和栈底
free(S->top);
S->top = S->bot = NULL;
if(NULL != S){
free(S);
S = NULL;
}
printf("销毁成功\n");
}
头文件:
#ifndef __05_H__
#define __05_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct Node{
union{
datatype data;
int len;
};
struct Node *next;
}Node,*NodePtr;
typedef struct{
NodePtr top; //栈顶
NodePtr bot; //栈底,即头结点
}ChainStack,*ChainStackPtr;
//创建链式栈
ChainStackPtr stack_create();
//判空
int stack_empty(ChainStackPtr S);
//入栈
int stack_push(ChainStackPtr S,datatype e);
//出栈
int stack_pop(ChainStackPtr S);
//遍历
void stack_show(ChainStackPtr S);
//获取栈顶元素
int stack_value_top(ChainStackPtr S);
//销毁
void stack_free(ChainStackPtr S);
#endif
测试文件:
#include "05.h"
int main(int argc, const char *argv[])
{
ChainStackPtr S = stack_create();
//调用入栈函数
stack_push(S,2);
stack_push(S,3);
stack_push(S,5);
stack_push(S,7);
stack_push(S,4);
//调用遍历函数
stack_show(S);
//调用出栈函数
stack_pop(S);
stack_pop(S);
stack_pop(S);
//调用遍历函数
stack_show(S);
//调用获取栈顶元素函数
datatype e = stack_value_top(S);
printf("栈顶元素为:%d\n",e);
//调用销毁函数
stack_free(S);
S = NULL;
return 0;
}