概念篇
如果你提前学过链表的相关知识和代码,那么学习这篇文章你会轻松很多。感兴趣的朋友可以看下这篇文章顺序表——链表(c语言)
如果你还想了解下用顺序表写栈的知识可以看下这篇文章用顺序表写栈(c语言)
栈是一种特殊的线性表,特殊于它先进后出的特征,而这个特征可以通过链表的方式实现。
如果你使用的是双链表,就可以实现一个双向栈
图示
代码篇
1.栈的生成
用结构体把一些属性封装起来表示栈
typedef struct node
{
int data;
struct node*next;
}node;
typedef struct stack
{
node*head;
//头指针
int size;
}stack;
2.栈的创建
初始化栈,大小为零,头指针为空。
void stack_creat(stack*stk)
{
stk->size=0;
stk->head=NULL;
}
3.栈的销毁
释放栈的内存空间,跟链表的销毁相似。
void stack_destroy(stack*stk)
{
while(stk->head)//遍历所有元素
{
node*newnode=stk->head;
//定义一个指针初始化为指向第一个结点
free(newnode);
//释放第一个结点的内存空间
stk->head=stk->head->next;
//更新头指针
}
}
4.入栈
入栈相当于把元素插在链表的最前面
void stack_push(stack*stk,int elements)
{
node*newnode=(node*)malloc(sizeof(node));
newnode->data=elements;
newnode->next=stk->head;
stk->head=newnode;
stk->size++;
}
5.出栈
相当于删除链表的第一个结点,并返回此结点的data成员
int stack_pop(stack*stk)
{
if(stk->size==0)
{
printf("stk underflow!");
exit(1);
}
node*newnode=stk->head;
int result=newnode->data;//保存栈的第一个元素
free(newnode);
stk->head=stk->head->next;
stk->size--;
return result;//返回元素
}
6.栈顶元素
相当于返回链表的第一个结点的data成员
int stack_top(stack*stk)
{
if(stk->size==0)
{
printf("stk is empty");
exit(1);
}
return stk->head->data;
}
7.栈的大小
int stack_size(stack*stk)
{
return stk->size;
}
8.完整代码
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int data;
struct node*next;
}node;
typedef struct stack
{
node*head;
//头指针
int size;
}stack;
void stack_creat(stack*stk)
{
stk->size=0;
stk->head=NULL;
}
void stack_destroy(stack*stk)
{
while(stk->head)//遍历所有元素
{
node*newnode=stk->head;
//定义一个指针初始化为指向第一个结点
free(newnode);
//释放第一个结点的内存空间
stk->head=stk->head->next;
//更新头指针
}
}
void stack_push(stack*stk,int elements)
{
node*newnode=(node*)malloc(sizeof(node));
newnode->data=elements;
newnode->next=stk->head;
stk->head=newnode;
stk->size++;
}
int stack_pop(stack*stk)
{
if(stk->size==0)
{
printf("stk underflow!");
exit(1);
}
node*newnode=stk->head;
int result=newnode->data;//保存栈的第一个元素
free(newnode);
stk->head=stk->head->next;
stk->size--;
return result;//返回元素
}
int stack_top(stack*stk)
{
if(stk->size==0)
{
printf("stk is empty");
exit(1);
}
return stk->head->data;
}
int stack_size(stack*stk)
{
return stk->size;
}
int main()
{
stack*stk;
stack_creat(&stk);
stack_push(&stk,10);
stack_push(&stk,20);
stack_push(&stk,30);
printf("stacktop is:%d\n",stack_top(&stk));
printf("stackpop is:%d\n",stack_pop(&stk));
printf("stk size is:%d",stack_size(&stk));
stack_destroy(&stk);
return 0;
/*入栈:10 20 30
stacktop:30
第一个出栈的是30
*/
}
运行结果
希望您能有所启发,望路过的大佬能进行指正和补充
在下篇的文章我将会说一些我对队列的见解