1 /* 2 * 四、数据结构基础之链栈 3 * 链栈数据结构(结构的定义+在此结构上的操作) 4 * --- 2012年4月28日 ---by lee 5 */ 6 7 #ifndef _LINKED_STACK_H 8 #define _LINKED_STACK_H 9 10 #include "Utility.h" 11 12 //类型定义 13 typedef int DataType; 14 15 //声明栈中结点类型 16 typedef struct _StackNode 17 { 18 DataType data; 19 struct _StackNode *next; 20 } StackNode; 21 22 /* 23 * 声明链栈 24 * 链栈就是没有附加头结点的运算受限的单链表,栈顶指针就是链表的头指针 25 * 该类型主要是方便在函数体中修改栈顶指针本身的值,否则需要向函数传递指针的指针 26 */ 27 typedef struct _LinkedStack 28 { 29 StackNode *top; //栈顶指针 30 } LinkedStack; 31 32 //对链栈的基本操作 33 34 void InitStack(LinkedStack* stack);//初始化,构造空栈 35 int IsStackEmpty(LinkedStack* stack);//判断栈是否为空 36 void Push(LinkedStack* stack, DataType x);//元素x入栈 37 DataType Pop(LinkedStack* stack);//栈顶出栈,返回栈顶元素 38 DataType StackTop(LinkedStack* stack);//取栈顶元素 39 40 //初始化,构造空栈 41 void InitStack(LinkedStack* stack) 42 { 43 stack->top=NULL; 44 } 45 46 //判断栈是否为空 47 int IsStackEmpty(LinkedStack* stack) 48 { 49 return (NULL==stack->top); 50 } 51 52 //元素x入栈 53 void Push(LinkedStack* stack, DataType x) 54 { 55 StackNode *node=(StackNode*)malloc(sizeof(StackNode)); 56 node->data=x; 57 node->next=stack->top; 58 stack->top=node; 59 } 60 61 //栈顶出栈,返回栈顶元素 62 DataType Pop(LinkedStack* stack) 63 { 64 //判断是否是空栈 65 if(IsStackEmpty(stack)) 66 Error("Stack is empty"); 67 StackNode *p=stack->top; 68 DataType ret=p->data; 69 stack->top=p->next; 70 free(p); 71 p=NULL; 72 return ret; 73 } 74 75 //取栈顶元素 76 DataType StackTop(LinkedStack* stack) 77 { 78 //判断是否是空栈 79 if(IsStackEmpty(stack)) 80 Error("Stack is null"); 81 82 return stack->top->data; 83 } 84 85 86 #endif 87 88 //测试代码 89 /* 90 LinkedStack ls; 91 InitStack(&ls); 92 Push(&ls,1); 93 Push(&ls,2); 94 Push(&ls,3); 95 printf("stack top: %d\n",Pop(&ls)); 96 printf("stack top: %d\n",Pop(&ls)); 97 */
转载于:https://www.cnblogs.com/programlee/archive/2012/05/05/2485111.html