• 栈的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;
    }
    
    
    
  • 相关阅读:
    VB6 获取和设置默认打印机
    VB操作EXCEL文件大全
    VB常用字符串操作函数
    VB数组的清除
    清理系统内存
    转:清理系统垃圾的BAT代码
    对Kalman(卡尔曼)滤波器的理解
    Kernel Memory Layout on ARM Linux
    linux kernel内存映射实例分析
    基于ARM的模拟器
  • 原文地址:https://www.cnblogs.com/ay-a/p/9757903.html
Copyright © 2020-2023  润新知