/**************************************************************** 文件内容:线性表之链栈操作 版本V1.0 作者:HFL 时间:2013-12-22 *****************************************************************/ #include<stdio.h> #include<stdlib.h> //#define RELEASE_VERSION //release版本开关 //#define TRIDiTION /*inlude<malloc.h> stdlib.h 包含malloc.h*/ #ifdef RELEASE_VERSION #define Log #else #define Log printf #endif /*为了提高程序的可移植性,千万不能使用裸露的数据类型*/ #ifndef UINT32 typedef unsigned int UINT32 ; #endif #ifndef INT32 typedef int INT32 ; #endif #define MAX 12 typedef struct Node { INT32 data; struct Node * next; }linkstack, * Lkstack; Lkstack Top;// 栈顶指针,相当于头指针,由于栈没有遍历和查找概念,故不引入头指针 /**************************************************************** 函数功能:创建一个节点 输入参数: 无 返回值:节点的指针 作者:HFL 时间:2013-12-22 *****************************************************************/ Lkstack Creat_Node(INT32 X) { Lkstack s; s=(struct Node *)malloc(sizeof(Node)); if(NULL==s) { Log(" sorry,Malloc is failed\n"); } else { Log(" Malloc is successed!\n"); s->data = X; } return s; } /**************************************************************** 函数功能:初始化链栈 输入参数: 无 返回值: 链栈的栈顶指针指针 作者:HFL 时间:2013-12-29 *****************************************************************/ Lkstack Init_Linkstack() { Top = NULL; return Top; } /**************************************************************** 函数功能:判断链栈是否为空栈 输入参数: 无 返回值: 链栈的标头指针 说明:链栈是由链来实现,所有的操作方式都是跟链表一样,只是某些操作堆栈来说是 非法的。 作者:HFL 时间:2013-12-29 *****************************************************************/ INT32 Is_Empty_Linkstack() { if (NULL == Top ) { Log("sorry,the stack is NULL"); return 0; } else { return 1; } } /**************************************************************** 函数功能: 链栈入栈 输入参数: 无 返回值: 链的栈的标准指针 说明:链栈是由链来实现,所有的操作方式都是跟链表一样,只是某些操作堆栈来说是 非法的。 作者:HFL 时间:2013-12-29 *****************************************************************/ Lkstack Push_Linkstack(INT32 X) { Lkstack s; s = Creat_Node(X); s->next = Top ; Top = s; return Top; } /**************************************************************** 函数功能: 链栈出栈 输入参数: 无 返回值: 链的栈的标准指针 说明:链栈是由链来实现,所有的操作方式都是跟链表一样,只是某些操作堆栈来说是 非法的。 作者:HFL 时间:2013-12-29 *****************************************************************/ INT32 Pop_Linkstack() { INT32 temp; Lkstack s; if(!Is_Empty_Linkstack()) { return -1; } temp = Top->data; s = Top; Top = Top->next; free (s); return temp; } /**************************************************************** 函数功能: 链栈读栈顶元素 输入参数: 无 返回值: 链的栈的标准指针 说明:链栈是由链来实现,所有的操作方式都是跟链表一样,只是某些操作堆栈来说是 非法的。 出栈会修改栈顶指针,而读栈顶元素,不需修改栈顶指针 作者:HFL 时间:2013-12-29 *****************************************************************/ INT32 Read_Linkstack( ) { INT32 temp; if(!Is_Empty_Linkstack()) { return -1; } temp = Top->data; return temp; } void main() { INT32 i ; Log("*******************************\n"); Log("* *\n"); Log("* Init LinkStack is start ! *\n"); Log("* *\n"); Log("*******************************\n"); Init_Linkstack(); Log("*******************************\n"); Log("* *\n"); Log("* Push LinkStack is start ! *\n"); Log("* *\n"); Log("*******************************\n"); for(i=0;i<MAX;i++) { Push_Linkstack(i+1); } Log("*******************************\n"); Log("* *\n"); Log("* Pop Linkstack is start ! *\n"); Log("* *\n"); Log("*******************************\n"); for(i=0;i<MAX-5;i++) { Log("The Pop element is %d\n",Pop_Linkstack()); } Log("*******************************\n"); Log("* *\n"); Log("* Read Linkstack element ! *\n"); Log("* *\n"); Log("*******************************\n"); Log("The stack top element is %d\n",Read_Linkstack()); }