四 栈的链式存储

简单链式栈

 1 ////////////链表结点结构体/////////////
 2 typedef struct Node
 3 {
 4     int data;
 5     Node* next;
 6 }Node;
 7 
 8 //创建结点
 9 Node* createNode(int data)
10 {
11     Node* newNode = (Node*)malloc(sizeof(Node));
12     newNode->data = data;
13     newNode->next = NULL;
14     return newNode;
15 }
16 
17 /////////栈结构体////////////////
18 typedef struct Stack
19 {
20     Node* stackTop;    //用栈顶指针表示整个链表
21     int size;
22 }stack;
23 
24 //创建栈
25 stack* createStack()
26 {
27     stack* mystack = (stack*)malloc(sizeof(stack));
28     mystack->stackTop = NULL;
29     mystack->size = 0;
30     return mystack;
31 }
32 //入栈
33 void push(stack* mystack, int data)
34 {
35     //入栈--->链表的表头插入
36     Node* newNode = createNode(data);
37     newNode->next = mystack->stackTop;
38     mystack->stackTop = newNode;    //栈顶指针移动
39     mystack->size++;
40 }
41 //获取栈顶元素
42 int top(stack* mystack)
43 {
44     if (mystack->size == 0)
45     {
46         printf("栈为空,无法获取");
47         system("pause");
48         return mystack->size;
49     }
50     return mystack->stackTop->data;
51 }
52 //出栈
53 void pop(stack* mystack)
54 {
55     if (mystack->size == 0)
56     {
57         printf("栈为空,无法获取");
58         system("pause");
59     }
60     else
61     {
62         //缓存
63         Node* nextNode = mystack->stackTop->next;
64         //删除
65         free(mystack->stackTop);
66         mystack->stackTop = nextNode;//栈顶指针移动
67         mystack->size--;
68     }
69 }
70 //判断栈是否为空
71 int empty(stack* mystack)
72 {
73     if (mystack->size == 0)
74         return 0;
75     return 1;    //返回1 表示栈不为NULL
76 
77 }
78 int main()
79 {
80     stack* mystack = createStack();
81     push(mystack, 1);
82     push(mystack, 2);
83     push(mystack, 3);
84     while (empty(mystack))
85     {
86         printf("%d-->", top(mystack));
87         pop(mystack);
88     }
89 
90     system("pause");
91     return 0;
92 }

企业链式栈

linkStack.h

 1 #pragma once
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 
 5 //链表小结点
 6 typedef struct StackNode
 7 {
 8     struct StackNode* next;
 9 }StackNode;
10 
11 //链栈结构体
12 typedef struct LinkStack
13 {
14     StackNode header;
15     int size;
16 }LinkStack;
17 
18 //初始化
19 LinkStack* Init_Stack();
20 
21 //压栈
22 void Push_Stack(LinkStack* LStack, StackNode* data);
23 
24 //弹栈
25 void* Pop_Stack(LinkStack* LStack);
26 
27 //获取栈顶
28 void* Top_Stack(LinkStack* LStack);
29 
30 //是否为空栈
31 int IsEmpty_Stack(LinkStack* LStack);
32 
33 //返回栈的大小
34 int Size_Stack(LinkStack* LStack);
35 
36 //销毁栈
37 void Desory_Stack(LinkStack* LStack);

linkStack.c

 1 #include "linkStack.h"
 2 
 3 //初始化
 4 LinkStack* Init_Stack()
 5 {
 6     LinkStack* LS = (LinkStack*)malloc(sizeof(LinkStack));
 7     LS->header.next = NULL;
 8     LS->size = 0;
 9     return LS;
10 }
11 
12 //压栈
13 void Push_Stack(LinkStack* LStack, StackNode* data)
14 {
15     if (LStack == NULL || data == NULL)
16     {
17         return;
18     }
19     data->next = LStack->header.next;
20     LStack->header.next=data;
21     LStack->size++;
22 }
23 
24 //弹栈
25 void* Pop_Stack(LinkStack* LStack)
26 {
27     if (LStack == NULL||LStack->size==0)
28         return NULL;
29     StackNode* node = LStack->header.next;
30     LStack->header.next = node->next;
31     LStack->size--;
32     return node;
33 
34 }
35 
36 //获取栈顶
37 void* Top_Stack(LinkStack* LStack)
38 {
39     if (LStack == NULL || LStack->size == 0)
40         return NULL;
41     StackNode* node = LStack->header.next;
42     return node;
43 }
44 
45 //返回栈的大小
46 int Size_Stack(LinkStack* LStack)
47 {
48     if (LStack == NULL)
49         return -1;
50     return LStack->size;
51 }
52 
53 
54 //是否为空栈  0 非空 1 空
55 int IsEmpty_Stack(LinkStack* LStack)
56 {
57     if (LStack == NULL || LStack->size == 0)
58         return 1;
59     return 0;
60 }
61 
62 //销毁栈
63 void Desory_Stack(LinkStack* LStack)
64 {
65     if (LStack == NULL)
66         return;
67     free(LStack);
68     LStack = NULL;
69 }

main.c

 1 #include "linkStack.h"
 2 
 3 //数据
 4 typedef struct Person
 5 {
 6     StackNode node;
 7     char name[64];
 8     int age;
 9 }Person;
10 
11 int main()
12 {
13     Person p1 = { "NULL","张飞",21 };
14     Person p2 = { "NULL","李逵",19 };
15     Person p3 = { "NULL","何进",23 };
16     Person p4 = { "NULL","武松",24 };
17     Person p5 = { "NULL","袁晓",20 };
18     //创建栈
19     LinkStack* stack = Init_Stack();
20     //插入数据
21     Push_Stack(stack, &p1);
22     Push_Stack(stack, &p2);
23     Push_Stack(stack, &p3);
24     Push_Stack(stack, &p4);
25     Push_Stack(stack, &p5);
26     printf("栈顶元素:name=%s age=%d\n", ((Person*)Top_Stack(stack))->name, ((Person*)Top_Stack(stack))->age);
27     while (!IsEmpty_Stack(stack))
28     {
29         Person* p = Pop_Stack(stack);
30         printf("name=%s age=%d\n", p->name, p->age);
31     }
32 
33     Desory_Stack(stack);
34     system("pause");
35     return 0;
36 }

 

posted @ 2020-05-09 14:31  mcf8293  阅读(87)  评论(0)    收藏  举报