链表实现栈
一、链式栈的结构
二、链式栈的指针指向
链式栈的指针指向栈的顶部
三、结点和栈的结构定义
typedef int ElemType;//定义存储的数据类型
typedef struct SNode //定义链结点结构
{
ElemType data;
SNode *next;
}SNode ,*pSNode;
typedef struct Stack //定义栈结构
{
pSNode pTop;
pSNode pBottom;
}Stack, *pStack;
三、栈操作定义
//1、初始化栈
void InitStack(pStack S);
//2、压栈
bool Push(pStack S, ElemType e);
//3、判断栈是否为空
bool StackEmpty(pStack S);
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e);
//5、遍历栈
void StackTraverse(pStack S);
//6、清空栈
void StackClear(pStack S);
//7、计算栈的大小
int StackLength(pStack S);
四、操作的实现
1、初始化栈
void InitStack(pStack S)
{
pSNode pNewNode = (pSNode)malloc(sizeof(SNode));
if (pNewNode == NULL)
{
printf("动态内存分配失败!程序结束\n");
exit(-1);
}
S->pTop = S->pBottom = pNewNode;// 栈顶和栈底都指向头结点
}
2、压栈
bool Push(pStack S,ElemType e)
{
pSNode pNewNode = (pSNode)malloc(sizeof(SNode));//创建新结节点
if (pNewNode == NULL)
{
printf("动态内存分配失败!程序结束\n");
exit(-1);
}
pNewNode->data = e;//新结点赋值
pNewNode->next = S->pTop;//新结点指向栈顶
S->pTop = pNewNode;//栈顶指针指向新结点
return true;
}
3、判断栈是否为空
bool StackEmpty(pStack S)
{
if (S->pTop == S->pBottom)
return true;
else
return false;
}
4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e)
{
pSNode p = S->pTop;//定义临时指针p指向栈顶
if (StackEmpty(S))
{
return false;
}
e = S->pTop->data;//获取栈顶指向结点值
S->pTop = S->pTop->next;//栈顶指针指向下一个结点
free(p);//释放空间
p = NULL;//临时指针p指向空
return true;
}
5、遍历栈
void StackTraverse(pStack S)
{
pSNode p = S->pTop;//定义临时指针p指向栈顶
while (p!=S->pBottom)
{
printf(" %d",p->data);
p = p->next;
}
printf("\n");
}
6、清空栈
void StackClear(pStack S)
{
pSNode p = S->pTop;//定义临时指针p指向栈顶
while (S->pTop != S->pBottom)
{
S->pTop = S->pTop->next;
free(p);
p = S->pTop;
}
free(p);
p = NULL;
}
7、计算栈的大小
int StackLength(pStack S)
{
pSNode p = S->pTop;
int i = 0;
while (p!=S->pBottom)
{
i++;
p = p->next;
}
return i;
}
最后给出完整代码
// 链式栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElemType;//定义存储的数据类型
typedef struct SNode //定义链结点结构
{
ElemType data;
SNode *next;
}SNode ,*pSNode;
typedef struct Stack //定义栈结构
{
pSNode pTop;
pSNode pBottom;
}Stack, *pStack;
//1、初始化栈
void InitStack(pStack S);
//2、压栈
bool Push(pStack S, ElemType e);
//3、判断栈是否为空
bool StackEmpty(pStack S);
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e);
//5、遍历栈
void StackTraverse(pStack S);
//6、清空栈
void StackClear(pStack S);
//7、计算栈的大小
int StackLength(pStack S);
int main()
{
Stack S;
InitStack(&S);
for (int i = 0; i < 10; i++)
{
Push(&S, 2 * i);
}
StackTraverse(&S);
if (StackEmpty(&S))
{
printf("栈为空\n");
}
else
{
printf("栈不为空\n");
}
printf("栈的大小为%d\n",StackLength(&S));
ElemType e;
for (int i = 0; i < 3; i++)
{
pop(&S, e);
printf("第 %d 个出栈元素值为 %d\n",i,e);
printf("栈的大小为%d\n", StackLength(&S));
}
StackClear(&S);
printf("栈的大小为%d\n", StackLength(&S));
return 0;
}
//1、初始化栈
void InitStack(pStack S)
{
pSNode pNewNode = (pSNode)malloc(sizeof(SNode));
if (pNewNode == NULL)
{
printf("动态内存分配失败!程序结束\n");
exit(-1);
}
S->pTop = S->pBottom = pNewNode;// 栈顶和栈底都指向头结点
}
//2、压栈
bool Push(pStack S,ElemType e)
{
pSNode pNewNode = (pSNode)malloc(sizeof(SNode));//创建新结节点
if (pNewNode == NULL)
{
printf("动态内存分配失败!程序结束\n");
exit(-1);
}
pNewNode->data = e;//新结点赋值
pNewNode->next = S->pTop;//新结点指向栈顶
S->pTop = pNewNode;//栈顶指针指向新结点
return true;
}
//3、判断栈是否为空
bool StackEmpty(pStack S)
{
if (S->pTop == S->pBottom)
return true;
else
return false;
}
//4、出栈出栈的值用e返回
bool pop(pStack S, ElemType &e)
{
pSNode p = S->pTop;//定义临时指针p指向栈顶
if (StackEmpty(S))
{
return false;
}
e = S->pTop->data;//获取栈顶指向结点值
S->pTop = S->pTop->next;//栈顶指针指向下一个结点
free(p);//释放空间
p = NULL;//临时指针p指向空
return true;
}
//5、遍历栈
void StackTraverse(pStack S)
{
pSNode p = S->pTop;//定义临时指针p指向栈顶
while (p!=S->pBottom)
{
printf(" %d",p->data);
p = p->next;
}
printf("\n");
}
//6、清空栈
void StackClear(pStack S)
{
pSNode p = S->pTop;//定义临时指针p指向栈顶
while (S->pTop != S->pBottom)
{
S->pTop = S->pTop->next;
free(p);
p = S->pTop;
}
free(p);
p = NULL;
}
//7、计算栈的大小
int StackLength(pStack S)
{
pSNode p = S->pTop;
int i = 0;
while (p!=S->pBottom)
{
i++;
p = p->next;
}
return i;
}