/*
这是我以前写的、、应付作业应该没问题、、不过好像没记数和销毁功能、、而且我也不知道lz说的记数和销毁是什么意思、、如果要改的话,请说下记数和销毁是什么意思、、
*/
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
//节点
struct Node
{
int date; //数据
struct Node* pNext; //用于指向上一个元素的地址
};
//栈
struct Strack
{
struct Node* save; //保存最上面一个元素的地址
struct Node* pTop; //顶部指针
struct Node* pBottom; //底部指针
void initStrack(struct Strack* p); //初始化栈
void pushNode(struct Strack* p, int date); //添加节点
void deleteNode(struct Strack* p); //删除节点
void coutStarckDate(struct Strack* p); //输出栈中所有的数据
void cleanStrack(struct Strack* p); //清空栈中的所有元素
};
void Strack::initStrack(struct Strack* p)
{
//1、生成一个无用的头节点, 并用pBottom指向它
p->pBottom = (Node* )malloc(sizeof(Node));
//2、判断内存是否分配成功
if (p->pBottom == NULL)
{
printf("内存分配失败!\n");
exit(-1);
}
//3、如果内存分配成功,则让pTop也指向这个头节点
else
{
printf("内存分配成功!头节点已生成,并且“底部指针”和“顶部指针”都指向它\n");
p->pTop = p->pBottom;
//这里弄成Null是因为coutStarckDate函数里要判断最后一个节点的地址为Null才停止输出
p->pBottom->pNext = NULL;
}
};
void Strack::pushNode(struct Strack* p, int date)
{
//1、创建一个新的节点
Node* node = (Node* )malloc(sizeof(Node));
//2、给新节点的date赋值
node->date = date;
//3、新节点的pNext指向上一个节地址
node->pNext = p->pTop;
//4、pTop指向新的节点地址
p->pTop = node;
};
void Strack::coutStarckDate(struct Strack* p)
{
//输出的时候保存最上面的一个元素的地址
p->save = p->pTop;
printf("栈中所有的元素\n");
//指的是数据的pNext是否为NULL
while (p->pTop->pNext != NULL)
{
printf("%d\n", *p->pTop);
//把“pTop”指向下一个数据的地址
p->pTop = p->pTop->pNext;
}
//输出完毕后把pTop指向最上面一个元素的地址,不然的话,在执行出栈的时候会因为p->pTop == p->pBottom而提示无元素删除的错误。
p->pTop = p->save;
}
void Strack::deleteNode(struct Strack* p)
{
if (p->pTop == p->pBottom)
{
printf("栈中已经没有元素了、、无法进行删除操作\n");
}
else
{
/*
这里只所以要定义一个临时变量temp, 是因为如果我们直接把pTop指针指向下一个节点,就会失去了最上面一个节点的地址。
这样的话就无法释放最上面一个节点的内存了。
*/
printf("被出栈的元素是:%d\n", *p->pTop);
//定义一个临时变量,这个临时变量也指向最上面的一个元素
Node* temp = p->pTop;
//pTop指向当前节点指向的下一个节点的地址
p->pTop = p->pTop->pNext;
//释放最上面一个节点
free(temp);
temp = NULL;
}
}
void Strack::cleanStrack(struct Strack* p)
{
while (p->pTop != p->pBottom)
{
Node* temp = p->pTop;
p->pTop = p->pTop->pNext;
free(temp);
temp = NULL;
}
printf("已把栈中所有的元素删除\n");
}
int main(void)
{
struct Strack strack;
strack.initStrack(&strack);
strack.pushNode(&strack, 3);
strack.pushNode(&strack, 30);
strack.pushNode(&strack, 300);
strack.pushNode(&strack, 3000);
//strack.cleanStrack(&strack);
strack.coutStarckDate(&strack);
return 0;
}
追问我们的是链栈不是顺序栈啊,没有用到top和bottom。销毁就是把栈给销毁了,计数就是栈帧个数
追答你说的是链表??
追问嗯嗯
追答链表没学过呢、、sorry、、
本回答被网友采纳