以带头结点的链式堆栈为例
//定义数据结构
/*初始化堆栈*/
void StackInitiate(SLNode** head);
/*堆栈是否为空*/
//如果为空返回0,否则返回1
int StackNotEmpty(SLNode* head);
/*入栈*/
//将链式堆栈head中插入数据元素x
//入栈成功返回1,否则返回0
int StackPush(SLNode* head, DataType x);
/*出栈*/
//将链式堆栈head中的元素出栈,出栈元素由x带回
//出站成功返回1,否则返回0
int StackPop(SLNode* head, DataType* x);
/*取当前栈顶元素*/
//将链式堆栈head当前栈顶元素由x返回
//取出成功返回1,否则返回0
int StackTop(SLNode* head, DataType* x);
/*撤销动态存储空间*/
void StackDestroy(SLNode* head);
1.定义结构体
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node* next;
}SLNode;
2.初始化堆栈
/*初始化堆栈*/
void StackInitiate(SLNode** head)
{
*head = (SLNode*)malloc(sizeof(SLNode));
(*head)->next = NULL;
}
3.堆栈是否为空
/*堆栈是否为空*/
//如果为空返回0,否则返回1
int StackNotEmpty(SLNode* head)
{
if (head->next != NULL)
return 1;
else
return 0;
}
4.入栈
/*入栈*/
//将链式堆栈head中插入数据元素x
//入栈成功返回1,否则返回0
int StackPush(SLNode* head, DataType x)
{
SLNode* p;
p = (SLNode*)malloc(sizeof(SLNode));
p->data = x;
p->next = head->next;
head->next = p;
return 1;
}
5.出栈
/*出栈*/
//将链式堆栈head中的元素出栈,出栈元素由x带回
//出站成功返回1,否则返回0
int StackPop(SLNode* head, DataType* x)
{
SLNode* p;
p = head->next;
if(p == NULL)
{
printf("当前堆栈已空无法出栈");
return 0;
}
head->next = p->next;
*x = p->data;
free(p);
return 1;
}
6.取当前栈顶元素
/*取当前栈顶元素*/
//将链式堆栈head当前栈顶元素由x返回
//取出成功返回1,否则返回0
int StackTop(SLNode* head, DataType* x)
{
SLNode* p;
p = head->next;
if (p == NULL)
{
printf("当前堆栈已空无法取出栈顶元素");
return 0;
}
*x = p->data;
return 1;
}
7.撤销动态空间
/*撤销动态存储空间*/
void StackDestroy(SLNode* head)
{
SLNode* p, * q;
p = head;
while (p!= NULL)
{
q = p;
p = p->next;
free(q);
}
}
代码测试如下
#include<stdio.h>
#include"stacklist.h"
int main()
{
SLNode *seqstacklist;
int i, x;
StackInitiate(&seqstacklist);
for (i = 0; i < 10; i++)
{
StackPush(seqstacklist, i + 1);
}
StackTop(seqstacklist, &x);
printf("当前栈顶元素为:%d\n", x);
while (StackNotEmpty(seqstacklist))
{
StackPop(seqstacklist, &x);
printf("%d ", x);
}
StackDestroy(seqstacklist);
}
运行结果如下