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 */