在还未料到可能可以系统化按顺序进行数据结构学习时,我就已经将我最最不熟的栈,先给处理了。详见三十天挑战数据结构(1)栈的实现和操作
今天看着书发现它还有一种链式表示方法,感觉和单链表有些相似,不妨也来试试,只针对其最最基础的创建和进栈出栈做点文章。
链式栈结构体:
//定义链式栈结构体
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top;
int number;
}LinkStack;
初始化栈:
//初始化栈链表
Status InitialStack(LinkStack *S)
{
S->top = NULL;
S->number = 0;
return OK;
}
进栈:
Status Push(LinkStack *S, ElemType e)
{
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = S->top;
S->top = s;
S->number++;
printf("new push: %d\n", s->data);
return OK;
}
出栈:
//弹出栈顶,并用e返回其值
Status Pop(LinkStack *S, ElemType *e)
{
LinkStackPtr p;
if(StackEmpty(S))
return ERROR;
*e = S->top->data;
p = S->top;
S->top = S->top->next;
free(p);
S->number--;
return OK;
}
完整代码和具体实现:
//跟单链表有些相似,只是对于插入和删除操作有特定要求
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
//定义链式栈结构体
typedef struct StackNode{
ElemType data;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack{
LinkStackPtr top;
int number;
}LinkStack;
//初始化栈链表
Status InitialStack(LinkStack *S)
{
S->top = NULL;
S->number = 0;
return OK;
}
//元素e进栈操作
Status Push(LinkStack *S, ElemType e)
{
LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));
s->data = e;
s->next = S->top;
S->top = s;
S->number++;
printf("new push: %d\n", s->data);
return OK;
}
//判断栈是否为空
Status StackEmpty(LinkStack *S)
{
if(S->number == 0)
return TRUE;
else
return FALSE;
}
//弹出栈顶,并用e返回其值
Status Pop(LinkStack *S, ElemType *e)
{
LinkStackPtr p;
if(StackEmpty(S))
return ERROR;
*e = S->top->data;
p = S->top;
S->top = S->top->next;
free(p);
S->number--;
return OK;
}
int main()
{
LinkStack *S;
S = (LinkStack *)malloc(sizeof(LinkStack));
InitialStack(S);
int i;
printf("start push:\n");
for(i=0; i<10; i++)
Push(S, i);
ElemType e;
printf("start pop:\n");
for(i=0; i<10; i++){
Pop(S, &e);
printf("%d ", e);
}
return 0;
}
程序运行结果: