一、链栈概述
链栈是栈的链式存储,是特殊的链表。
链栈操作都是在链表的一端实现的:
①如果在链表尾操作,在每一次入栈和出栈都需要找到链表的尾结点,导致效率较低;
②把链表的头结点作为栈顶结点,入栈就采用头部插入法,出栈采用尾部插入结点。
特殊:链栈的每一个结点都包含数据域和指针域:
typedef struct node{
data_t data;//栈元素结点数据域
struct node *next;//指针域
}node_t;
二、相关操作
common.h
#ifndef _COMM0N_H_
#define _COMMON_H_
//栈数据类型定义
typedef int data_t;
typedef struct node{
data_t data;//栈元素结点数据域
struct node *next;//指针域
}node_t;
node_t *CreateLinkStack(void);//栈顶结点初始化
int pushLinkStack(node_t *top, data_t mydata);//入栈
int GetLinkStack(node_t *top, data_t *mydata);//获得栈顶元素
int PopLinkStack(node_t *top);//出栈
#endif
linkstack.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
//栈顶结点初始化
node_t *CreateLinkStack(void)
{
node_t *top;
//分配空间
top = malloc(sizeof(node_t));
//创建失败
if(top == NULL)
return NULL;
top->next = NULL;
return top;
}
//入栈
int pushLinkStack(node_t *top, data_t mydata)
{
node_t *q;//入栈元素为q
if(top == NULL)
return -1;
//入栈结点分配空间
q = malloc(sizeof(node_t));
if(q == NULL)
return -1;
q->data = mydata;
//入栈
q->next = top->next;
top->next = q;
return 0;
}
//获得栈顶元素
int GetLinkStack(node_t *top, data_t *mydata)
{
if(top == NULL)
return -1;
if(top->next == NULL)//空栈
return -1;
*mydata = top->next->data;
return 0;
}
//出栈
int PopLinkStack(node_t *top)
{
node_t *p;
if(top == NULL)
return -1;
if(top->next == NULL)
return -1;
//出栈操作
p = top->next;
top->next = p->next;
free(p);//释放
return 0;
}
app.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
int main()
{
int i;
node_t *top;
data_t mydata;
top = CreateLinkStack();
if(top == NULL)
return -1;
i = 20;
while(i)
{
if(pushLinkStack(top,i--)==-1)
{
printf("%d push fail\n",i);
}
}
while(GetLinkStack(top, &mydata) == 0)
{
printf("Pop : %d\n", mydata);
PopLinkStack(top);
}
return 0;
}
三、编译运行结果
如想看顺序栈,可点击:顺序栈的介绍和相关操作