数据结构-栈的操作
Posted 坏坏-5
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-栈的操作相关的知识,希望对你有一定的参考价值。
栈的综合程序
主函数
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
/*定义结点*/
typedef struct Node
{
int data; //数据域
struct Node * pNext; //指针域·
}NODE, * PNODE;
/*定义指向结点的指针*/
typedef struct Stack
{
PNODE pTop; //指向栈顶
PNODE pBottom; //指向栈底
}Stack, * PStack;
/*函数声明*/
void Init(PStack); //对栈进行初始化
void Push(PStack, int); //压栈
void Traverse(PStack); //遍历栈
bool Empty(PStack);
bool Pop(PStack, int *); //出栈
void Clear(PStack); //清空栈中的数据
int main(void)
{
Stack S; //定义用来指向栈顶和栈底的指针变量
int val; //用于存放出栈元素的值
Init(&S); //对栈进行初始化,造出一个空栈
Push(&S, 1); //向栈中压入数据
Push(&S, 2);
Push(&S, 3);
Push(&S, 4);
Push(&S, 5);
printf("--------遍历栈--------\\n");
Traverse(&S); //对栈进行遍历输出
printf("---------出栈---------\\n");
if(Pop(&S, &val))
printf("出栈的元素是:%d\\n出栈成功!\\n", val);
else
printf("出栈失败!\\n");
printf("--------出栈后--------\\n");
Traverse(&S);
printf("清空栈\\n");
Clear(&S);
printf("--------遍历栈--------\\n");
if(Empty(&S))
printf("栈为空!\\n");
else
Traverse(&S);
return 0;
}
对栈的初始化函数
/*对栈的初始化函数*/
void Init(PStack pS)
{
/*动态分配一个结点指针,用于指向头结点*/
pS->pTop = (PNODE)malloc(sizeof(NODE));
/*判断动态内存是否分配成功*/
if (NULL == pS->pTop)
{
printf("内存分配失败!\\n");
exit(-1);
}
else
{
/*当栈为空时,pTop和pBottom都指向同一个结点*/
pS->pBottom = pS->pTop;
/*将头指针中的指针域清空*/
pS->pTop->pNext = NULL;
}
}
压栈函数
/*压栈函数*/
void Push(PStack pS, int val)
{
/*动态分配一个指向新临时结点的指针*/
PNODE pNew = (PNODE)malloc(sizeof(NODE));
/*
将用户输入的数据赋值给pNew中的data
pNew中的pNext指向原本pTop指向的头指针
重新使pTop指向新的结点
*/
pNew->data = val;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
}
对栈的遍历
/*对栈的遍历函数*/
void Traverse(PStack pS)
{
/*定义一个临时栈指针,指向栈顶*/
PNODE p = pS->pTop;
/*
判断p是否等于pBottom,即p是否指向栈底
不指向栈底则输出数据,使p指向下一个结点
*/
while(p != pS->pBottom)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\\n");
return;
}
判断栈是否为空
/*判断栈是否为空*/
bool Empty(PStack pS)
{
/*pTop等于pBottom则表明栈为空*/
if(pS->pTop == pS->pBottom)
return true;
else
return false;
}
出栈函数
/*出栈函数*/
bool Pop(PStack pS, int * val)
{
/*
把pS指向的栈出栈以此,并把出栈的元素存入
val形参所指向的变量中,出栈成功返回true,
出栈失败返回false
*/
if(Empty(pS))
return false;
else
{
/*
定义一个临时结点指针,指向栈顶。将栈顶中的值
赋值给val,使pTop指向下一个结点,此结点作为栈顶
将p指向的原本的栈顶释放,并把p清空
*/
PNODE p = pS->pTop;
*val = p->data;
pS->pTop = p->pNext;
free(p);
p = NULL;
return true;
}
}
清空栈中的数据
/*清空栈中的数据*/
void Clear(PStack pS)
{
/*先判断栈是否为空,为空则直接结束*/
if(Empty(pS))
return;
else
{
/*
定义结点指针p,指向栈顶
定义指针q指向栈顶的下一个结点
*/
PNODE p = pS->pTop;
PNODE q = NULL;
/*判断p是否指向栈底*/
while(p != pS->pBottom)
{
/*
p指向栈顶,q指向栈顶的下一个结点,
下一个结点不是栈底,则释放p指向的结点,
即原有的栈顶。使p等于现有的栈顶,
即原有的栈顶下一个结点q
*/
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom; //使栈顶等于栈底
}
}
完整程序代码
/*
1.栈的创建
2.压栈
3.遍历
4.出栈
5.清空栈中的数据
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>
/*定义结点*/
typedef struct Node
{
int data; //数据域
struct Node * pNext; //指针域·
}NODE, * PNODE;
/*定义指向结点的指针*/
typedef struct Stack
{
PNODE pTop; //指向栈顶
PNODE pBottom; //指向栈底
}Stack, * PStack;
/*函数声明*/
void Init(PStack); //对栈进行初始化
void Push(PStack, int); //压栈
void Traverse(PStack); //遍历栈
bool Empty(PStack);
bool Pop(PStack, int *); //出栈
void Clear(PStack); //清空栈中的数据
int main(void)
{
Stack S; //定义用来指向栈顶和栈底的指针变量
int val; //用于存放出栈元素的值
Init(&S); //对栈进行初始化,造出一个空栈
Push(&S, 1); //向栈中压入数据
Push(&S, 2);
Push(&S, 3);
Push(&S, 4);
Push(&S, 5);
printf("--------遍历栈--------\\n");
Traverse(&S); //对栈进行遍历输出
printf("---------出栈---------\\n");
if(Pop(&S, &val))
printf("出栈的元素是:%d\\n出栈成功!\\n", val);
else
printf("出栈失败!\\n");
printf("--------出栈后--------\\n");
Traverse(&S);
printf("清空栈\\n");
Clear(&S);
printf("--------遍历栈--------\\n");
if(Empty(&S))
printf("栈为空!\\n");
else
Traverse(&S);
return 0;
}
/*对栈的初始化函数*/
void Init(PStack pS)
{
/*动态分配一个结点指针,用于指向头结点*/
pS->pTop = (PNODE)malloc(sizeof(NODE));
/*判断动态内存是否分配成功*/
if (NULL == pS->pTop)
{
printf("内存分配失败!\\n");
exit(-1);
}
else
{
/*当栈为空时,pTop和pBottom都指向同一个结点*/
pS->pBottom = pS->pTop;
/*将头指针中的指针域清空*/
pS->pTop->pNext = NULL;
//等价于pS->Bottom->pNext = NULL;
}
}
/*压栈函数*/
void Push(PStack pS, int val)
{
/*动态分配一个指向新临时结点的指针*/
PNODE pNew = (PNODE)malloc(sizeof(NODE));
/*
将用户输入的数据赋值给pNew中的data
pNew中的pNext指向原本pTop指向的头指针
重新使pTop指向新的结点
*/
pNew->data = val;
pNew->pNext = pS->pTop;
pS->pTop = pNew;
}
/*对栈的遍历函数*/
void Traverse(PStack pS)
{
/*定义一个临时栈指针,指向栈顶*/
PNODE p = pS->pTop;
/*
判断p是否等于pBottom,即p是否指向栈底
不指向栈底则输出数据,使p指向下一个结点
*/
while(p != pS->pBottom)
{
printf("%d ", p->data);
p = p->pNext;
}
printf("\\n");
return;
}
/*判断栈是否为空*/
bool Empty(PStack pS)
{
/*pTop等于pBottom则表明栈为空*/
if(pS->pTop == pS->pBottom)
return true;
else
return false;
}
/*出栈函数*/
bool Pop(PStack pS, int * val)
{
/*
把pS指向的栈出栈以此,并把出栈的元素存入
val形参所指向的变量中,出栈成功返回true,
出栈失败返回false
*/
if(Empty(pS))
return false;
else
{
/*
定义一个临时结点指针,指向栈顶。将栈顶中的值
赋值给val,使pTop指向下一个结点,此结点作为栈顶
将p指向的原本的栈顶释放,并把p清空
*/
PNODE p = pS->pTop;
*val = p->data;
pS->pTop = p->pNext;
free(p);
p = NULL;
return true;
}
}
/*清空栈中的数据*/
void Clear(PStack pS)
{
/*先判断栈是否为空,为空则直接结束*/
if(Empty(pS))
return;
else
{
/*
定义结点指针p,指向栈顶
定义指针q指向栈顶的下一个结点
*/
PNODE p = pS->pTop;
PNODE q = NULL;
/*判断p是否指向栈底*/
while(p != pS->pBottom)
{
/*
p指向栈顶,q指向栈顶的下一个结点,
下一个结点不是栈底,则释放p指向的结点,
即原有的栈顶。使p等于现有的栈顶,
即原有的栈顶下一个结点q
*/
q = p->pNext;
free(p);
p = q;
}
pS->pTop = pS->pBottom; //使栈顶等于栈底
}
}
/*运行结果*/
--------遍历栈--------
5 4 3 2 1
---------出栈---------
出栈的元素是:5
出栈成功!
--------出栈后--------
4 3 2 1
清空栈
--------遍历栈--------
栈为空!
Press any key to continue . . .
以上内容均属原创,如有不详或错误,敬请指出。
本文链接: https://blog.csdn.net/qq_45668124/article/details/117202380
版权声明: 本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请联系作者注明出处并附带本文链接!
以上是关于数据结构-栈的操作的主要内容,如果未能解决你的问题,请参考以下文章