1. 实验目的
(1)掌握栈的链接存储结构;
(2)验证链栈及其基本操作的实现;
(3)验证栈的操作特性。
2. 实验内容
(1)建立一个空栈
(2)对已建立的栈进行插入、删除、取栈顶元素等基本操作。
3. 实验提示
定义链栈中的结点结构(链栈中结点结构基于单链表相同),定义链栈的数据类型——链栈结构体,包括入栈、出栈、取栈顶元素等基本操作。本节的实验采用模板实现,要求学生:
(1)假设栈元素为字符型,修改主函数;
(2)重新设计测试数据,考查栈的上溢、下溢等情况,修改主函数。
4. 程序代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
//栈元素的数据类型,假设为int型
typedef int DataType;
typedef struct Node
{
//存放栈元素的数据域typedef struct Node
DataType data;
//存放下一个节点的地址
struct Node *next;
}Node;
//栈顶指针
Node *top;
//链栈的初始化
void InitStack(Node *top)
{
//初始化为空栈
top=NULL;
if(top==NULL)
{
printf("链表初始化完成,top=NULL\n");
printf("***********************************\n");
}
}
//入栈
DataType *Push(Node *top,DataType x)
{
//申请节点空间
Node *s=(Node *)malloc(sizeof(Node));
s->data=x;
if(top==NULL)
{
printf("这是一个空栈,因为这是第一次入栈\n");
s->next=NULL;
}
else
{
printf("这不是一个空栈,因为这不是第一次入栈了\n");
//将节点s插到栈顶
s->next=top;
}
top=s;
if(top!=NULL)
{
printf("%d入栈成功\n",x);
printf("***********************************\n");
}
return top;
}
//出栈
DataType *Pop(Node *top,DataType *ptr)
{
Node *p=top;
if(top==NULL)
{
printf("下溢错误,删除失败\n");
return 0;
}
//存储栈顶元素
*ptr=top->data;
//将栈顶节点摘链
top=top->next;
free(p);
return top;
}
//获取栈顶元素
int GetTop(Node *top,DataType *ptr)
{
if(top==NULL)
{
printf("下溢错误,取栈顶失败\n");
return 0;
}
else
{
*ptr=top->data;
return 1;
}
}
//判空操作 若空则返回1
int Empty(Node *top)
{
if(top==NULL)
{
return 1;
}
else
{
return 0;
}
}
//销毁栈
void DestoryStack(Node *top)
{
Node *p=top;
//依次释放链栈的每一个节点
while(top!=NULL)
{
top=top->next;
free(p);
p=top;
}
}
int main()
{
DataType x;
//定义链栈的栈顶指针并初始化
Node *top=NULL;
//初始化链栈
InitStack(top);
printf("对15执行入栈操作:\n");
top=Push(top,15);
printf("对10执行入栈操作:\n");
top= Push(top,10);
if(GetTop(top,&x)==1)
{
//输出栈顶元素 10
printf("当前栈顶元素为:%d\n",x);
printf("***********************************\n");
}
if(top=Pop(top,&x))
{
//输出出栈元素
printf("执行一次出栈操作,删除元素为:%d\n",x);
printf("***********************************\n");
}
if(GetTop(top,&x)==1)
{
//输出当前栈顶元素15
printf("当前栈顶元素为:%d\n",x);
printf("***********************************\n");
}
printf("请输入待插元素值:");
scanf("%d",&x);
top=Push(top,x);
if(Empty(top)==1)
{
printf("栈为空\n");
}
else
{
printf("栈非空\n");//输出为非空
}
DestoryStack(top);
return 0;
}
5. 实验结果
6. 实验结果
1. 2.
解决:
对于问题1一个是因为S没有声明,并且传参应该是Top,把S换成Top就对了。还有下面一个问题说DestoryStack()这个函数没有声明,然后我就尝试自己声明,不过最终失败了,然后我就拿着书照着声明一遍,最后好使了。
对于问题2是因为Data类型定义错了,结构体应该写成typedef struct Node这样,最后修改完之后就能运行了。