一、链表的概述
链栈和链表非常相似,唯一不同的是链栈的插入和删除操作均在链表头部上进行,链表尾部就是栈底。
二、链表的基本运算
链表的基本运算包括初始化,判空表,入栈,出栈,取栈顶元素,下面以代码的方式展现出来。
linkstack.h:
/*
作者:张小五
时间:2018年1月29日
*/
#ifndef LINKSTACK_H_
#define LINKSTACK_H_
#define maxsize 64 //栈的容量
#define TRUE 1
#define FALSE 0
#include "stdio.h"
#include "stdlib.h"
typedef struct node{
int data; //数据区
struct node *next; //指针
}linkStack,*linkTop; //链栈类型定义,定义指向链栈栈顶的指针top
void InitStack(linkTop top); //初始化栈
void PushStack(linkTop top,int x);//元素进栈
int PopStack(linkTop top,int *x);//元素出栈
int IsEmpty(linkTop top); //判空栈
void ShowTop(linkTop top); //取栈顶元素
#endif // LINKSTACK_H_
linkstack.c:#include "stdio.h"
#include "stdlib.h"
#include "linkstack.h"
//初始化栈
void InitStack(linkTop top){
top->next = NULL;
}
//判空表
int IsEmpty(linkTop top){
return (top->next==NULL)?TRUE:FALSE;
}
//元素进栈
void PushStack(linkTop top,int x){
linkTop P=(linkTop)malloc(sizeof(linkStack));
P->data = x;
P->next = top->next;
top->next =P;
}
//元素出栈
int PopStack(linkTop top,int *x){
if(IsEmpty(top)){
return FALSE;
}
linkTop p = top->next; //定义辅助指针
*x = p->data; //取出数据
top->next = p->next;//栈顶下移
free(p); //释放原栈顶结点
return TRUE;
}
//取栈顶元素
void ShowTop(linkTop top){
int x;
if(!IsEmpty(top)){
printf("栈顶元素为:%d\n",top->next->data);
}
}
main.c:/*
作者:张小五
时间:2018年1月29日
*/
#include "stdio.h"
#include "stdlib.h"
#include "linkstack.h"
#include "linkstack.c"
int main (int argc, char *argv[]){
int x = 0;
int i = 1;
//初始化栈
linkTop top=(linkTop)malloc(sizeof(linkStack));
InitStack(top);
//进栈
while(x!=-1){
printf("请输入第%d个元素(以-1结束):",i);
scanf("%d",&x);
if(x==-1){
break;
}
PushStack(top,x);
i++;
}
//打印栈顶元素
ShowTop(top);
//出栈
printf("出栈顺序:\n");
while(!IsEmpty(top)){
PopStack(top,&x);
printf("%d ",x);
}
return 0;
}
链栈的特点是它没有上溢的限制,它就像是一条一头固定的链子,可以活动的一头自由的增加结点而不会溢出,链栈不需要在头部附加头结点,因为栈都是在头部进行操作的,如果加了头结点,反而使算法更加复杂,所以只要有链表的头指针就可以了。