栈的C语言实现

一个栈的C语言实现,函数声明放在 line_list.h 头文件汇总,函数定义放在line_list.c 中,main.c 用来测试各个函数.

1.文件 stack.h

//  stack.h

#ifndef  __STACK_H__
#define  __STACK_H__

typedef int DataType;
typedef struct node{
	DataType data;
	struct node * next;
}Stack;

Stack* CreateStack();	//创建栈
void StackEmpty(Stack* );  //清空栈
void DestoryStack(Stack*); //撤销(删除)栈
int IsEmpty(Stack*);	//判空
int PushStack(Stack*, DataType);	//入栈
int PopStack(Stack*);	//出栈
DataType GetTopElement(Stack*);	//取栈顶元素


#endif
  1. 文件 stack.c
// stack.c

/*
	一个基于链表实现的栈的简单例子,没有做逆向增长,固定长度等限制。此外,利用数组等也可实现栈。
	仅用来演示栈先进后出的原理。第一个元素存储在 stack->next 中

*/

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

//创建栈,此时栈中没有任何元素
Stack* CreateStack()
{
	Stack *stack = (Stack*)malloc(sizeof(Stack));
	if(NULL != stack)
	{
	   stack->next = NULL;
	   return stack;
	}
	printf("out of place.
");
	return NULL;
}

//清空栈
void StackEmpty(Stack* stack)
{
	while(!IsEmpty(stack))
	{
		PopStack(stack);
	}
	printf("now stack is empty. 
");
}

//撤销栈
void DestoryStack(Stack* stack)
{
	free(stack);
	printf("now stack is destoryed. 
");
	exit(0);
}

int IsEmpty(Stack* stack)
{
	return (stack->next == 0);
}

//入栈,成功返回1,失败返回0, 把元素 data 存入 栈 stack 中
int PushStack(Stack* stack, DataType data)
{
	Stack* newst = (Stack*)malloc(sizeof(Stack));
	if(NULL != newst)
	{
		newst->data = data;
		newst->next = stack->next;	//s->next = NULL;
		stack->next = newst;
		return 1;
	}
	printf("out of place PushStack.
");
	return 0;
}

/*
	出栈,成功返回1,失败返回0,出栈不取出元素值,只是删除栈顶元素。
	如出栈要实现,取出元素值,并释放空间,可结合取栈顶元素函数做修改,这里不再给出。
 */

int PopStack(Stack* stack)
{
	Stack* tmpst;
	if(!IsEmpty(stack))
	{
		tmpst = stack->next;
		stack->next = tmpst->next;
		free(tmpst);
		return 1;
	}
	return 0;
}

//取栈顶元素,仅取出栈顶元素的值,取出之后,该元素,任然存在栈中。成功返回元素值,失败输出提示信息,并返回 -1
DataType GetTopElement(Stack* stack)
{
	if(!IsEmpty(stack))
	{
		return stack->next->data;
	}
	printf("stack is empty GetTopElement.
");
	return -1;
}
  1. 文件main.c
// main.c

#include <stdio.h>
#include "stack.h"

int main()
{
	//测试创建栈函数
	Stack* stack = CreateStack();
	printf("StackTopElement =  %d 
",GetTopElement(stack));

	//测试入栈函数
	PushStack(stack,5);	
	printf("StackTopElement =  %d 
",GetTopElement(stack));

	PushStack(stack,6);
	printf("StackTopElement =  %d 
",GetTopElement(stack));

	PushStack(stack,7);
	printf("StackTopElement =  %d 
",GetTopElement(stack));

	//测试出栈函数
	PopStack(stack);
	printf("StackTopElement =  %d 
",GetTopElement(stack));
	PopStack(stack);
	printf("StackTopElement =  %d 
",GetTopElement(stack));

	//测试清空栈函数
	StackEmpty(stack);
	printf("StackTopElement =  %d 
",GetTopElement(stack));

	//测试撤销栈函数
	DestoryStack(stack);

	return 0;
}


原文地址:https://www.cnblogs.com/ay-a/p/9757903.html