C实现链栈

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这样,最后修改完之后就能运行了。

发布了38 篇原创文章 · 获赞 130 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_41587612/article/details/98528257