栈,有两种实现方式,一是静态的,由数组实现,一种是动态的,由链表实现,只不过它只能从一端进出,也就是先进后出,很多人喜欢用弹夹举例,确实,栈和弹夹在很是相似,数据就好比弹夹里面的子弹。所以,栈写起来和链表会有那么一点相似。话不多说,直接上代码。
这里主要罗列出来了栈的创建,添加元素,删除元素,清空栈,打印栈这几种基本功能,实现语言为C语言,里面的测试数据可以任意更换。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//定义一个节点
typedef struct node{
int age;
char*name;
struct node* next;
}NODE,*PNODE;
//定义一个栈
typedef struct stack{
PNODE top;
PNODE bottom;
}STACK,*PSTACK;
//定义相关函数
void Create_Stack(PSTACK s);
void Push_Stack(PSTACK S,int val,char*name);
int Pop_Stack(PSTACK S);
void Traverse_Stack(PSTACK S);
void Clear_Stack(PSTACK S);
//主函数
int main(){
PSTACK S = (PSTACK)malloc(sizeof(STACK));
Create_Stack(S);
Push_Stack(S,25,"Tony");
Push_Stack(S,19,"NKPDQZ");
Push_Stack(S,21,"PHILL");
Push_Stack(S,20,"LEO");
Push_Stack(S,22,"FIZE");
Push_Stack(S,23,"SIMONS");
Push_Stack(S,24,"ZHU");
Pop_Stack(S);
Traverse_Stack(S);
//在这里可以继续调用其他函数
return 0;
}
//创建一个栈
void Create_Stack(PSTACK s)
{
s->bottom = (PNODE)malloc(sizeof(NODE));
if(s->bottom == NULL)
{
printf("内存分配出错");
exit(-1);
}
else
{
s->top = s->bottom;
s->bottom->next = NULL;
s->top->next = NULL;
}
}
//压栈(入栈)
void Push_Stack(PSTACK S,int val,char*name)
{
PNODE p = (PNODE)malloc(sizeof(NODE));
if(p == NULL)
{
printf("内存分配出错");
exit(-1);
}
else
{
p->age = val;
p->name = name;
p->next = S->top;
S->top = p;
}
}
//出栈
int Pop_Stack(PSTACK S)
{
if(S->top == S->bottom)
{
return -1;
}
else
{
PNODE p = S->top;
S->top = S->top->next;
free(p);
p = NULL;
return S->top->age;
}
}
//打印栈中的全部元素
void Traverse_Stack(PSTACK S)
{
PNODE p = S->top;
printf("栈中的元素为:\n");
while(p != S->bottom)
{
printf("%d\t%s\n",p->age,p->name);
p = p->next;
}
}
//清空栈
void Clear_Stack(PSTACK S)
{
if(S->top == S->bottom)
{
return;
}
else
{
PNODE p = NULL;
while(S->top != S->bottom)
{
p = S->top;
S->top = S->top->next;
free(p);
p = NULL;
}
}
return;
}
参考博客:
数据结构:栈的链式实现(C语言描述)