用链表来实现堆栈,用的是头插法,先进后出。
1、把一个元素压入堆栈是通过在链表头部添加一个元素实现。先新建一个指针指向new_node要添加进来的元素,然后它要指向之前的第一个元素,并且指向第一个节点的指针要指向它
void push (int data)
2、弹出一个元素是通过删除链表头部第一个元素实现。我们要保证指向第一个元素的指针永远指向在第一个元素这个位置上的元素:head = first_node->next;,这个first_node是我们即将弹出的那个元素。void pop(void)
3、打印堆栈:新建一个指针指向头部第一个元素,然后判断,如果这个元素不为空,则打印这个元素的data,然后新建的那个指针指向下一个元素,直到这个指针指向的元素为空,则打印完成。
//定义一个结构以存储堆栈元素
#include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <malloc.h>
5
6 #define THIS
7
8 typedef struct node_s
9 {
10 int data;
11 struct node_s *next;
12 }stack;
13 //指向堆栈中第一个节点的指针
14 static stack *head;
15
16 void push(int data);
17 void pop(void);
18 int empty(void);
19 void print(void);
20 void destroty_stack(void);
21
22 void push(int data)
23 {
24 stack *new_node;
25 new_node = (stack *)malloc(sizeof(stack));
26 if(new_node == NULL)
27 perror("malloc fail");
28 new_node->data = data;
29 new_node->next = head;
30 head = new_node;
31 }
32
33 void pop()
34 {
35 stack *first_node;
36 first_node = head;
37 head = first_node->next;
38 free(first_node);
39
40
41 }
int empty()
45 {
46 /* if(head == NULL)
47 {
48 return 0;
49 }else
50 return 1;
51 */
52 return head ==NULL;
53 }
54
55 void print(void)
56 {
57 stack *p_node;
58 p_node = head;
59 printf("打印出链式堆栈里面的值:");
60 if(p_node == NULL)
61 printf("堆栈为空\n");
62 while(p_node != NULL)
63 {
64 printf("%d",p_node->data);
65 p_node = p_node->next;
66 }
67 printf("\n");
68 }
69
70 void destroy_stack()
71 {
72 while(!empty())
73 pop();
74 }
75
76 int main()
77 {
78
79 #ifdef THIS
80 char ch[1];
81 char sh[1];
int num = 1;
83 int a,b;
84 printf("你想新建一个多大的堆栈:");
85 scanf("%s\n",ch);
86 a = atoi(ch);
87 for(num; num <= a; num++)
88 {
89 char A[1];
90 printf("压入的第%d个数据:" ,num);
91 scanf("%s\n",A);
92 int c;
93 c = atoi(A);
94 push(c);
95 }
96 printf("你新建好的堆栈:");
97 print();
98
99 printf("你想弹出几个数据:");
100 scanf("%s\n",sh);
101 b = atoi(sh);
102 for(num; num<=b; num++);
103 {
104 pop();
105 }
106 printf("打印剩下的数据:");
107 print();
108 destroy_stack();
109 #else
110 print();
111 push(10);push(9);push(8);
112 push(7);push(6);
113 printf("push压入数值后:\n");
114 print();
115 pop();
116 pop();
117 printf("pop几个出去之后的数值:\n");
118 print();
119 destroy_stack();
120 #endif
121 return 1 ;
122 }