概要
本章会先对栈的原理进行介绍,然后分别通过C/C++/Java三种语言来演示栈的实现示例。注意:本文所说的栈是数据结构中的栈,而不是内存模型中栈。内容包括:
1. 栈的介绍
2. 栈的C实现
3. 栈的C++实现
4. 栈的Java实现
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3562239.html
更多内容: 数据结构与算法系列 目录
栈的介绍
栈(stack),是一种线性存储结构,它有以下几个特点:
(01) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
(02) 向栈中添加/删除数据时,只能从栈顶进行操作。
栈通常包括的三种操作:push、peek、pop。
push -- 向栈中添加元素。
peek -- 返回栈顶元素。
pop -- 返回并删除栈顶元素的操作。
1. 栈的示意图
栈中的数据依次是 30 --> 20 --> 10
2. 出栈
出栈前:栈顶元素是30。此时,栈中的元素依次是 30 --> 20 --> 10
出栈后:30出栈之后,栈顶元素变成20。此时,栈中的元素依次是 20 --> 10
3. 入栈
入栈前:栈顶元素是20。此时,栈中的元素依次是 20 --> 10
入栈后:40入栈之后,栈顶元素变成40。此时,栈中的元素依次是 40 --> 20 --> 10
下面介绍栈的实现,分别介绍C/C++/Java三种实现。
栈的C实现
共介绍4种C语言实现。
1. C语言实现一:数组实现的栈,并且只能存储int数据。
2. C语言实现二:单向链表实现的栈,并且只能存储int数据。
3. C语言实现三:双向链表实现的栈,并且只能存储int数据。
4. C语言实现四:双向链表实现的栈,能存储任意类型的数据。
1. C语言实现一:数组实现的栈,并且只能存储int数据
实现代码(array_stack.c)
1 #include <stdio.h>
2 #include <malloc.h>
3
4 /**
5 * C 语言: 数组实现的栈,只能存储int数据。
6 *
7 * @author skywang
8 * @date 2013/11/07
9 */
10
11 // 保存数据的数组
12 static int *arr=NULL;
13 // 栈的实际大小
14 static int count;
15
16 // 创建“栈”,默认大小是12
17 int create_array_stack(int sz)
18 {
19 arr = (int *)malloc(sz*sizeof(int));
20 if (!arr)
21 {
22 printf("arr malloc error!");
23 return -1;
24 }
25
26 return 0;
27 }
28
29 // 销毁“栈”
30 int destroy_array_stack()
31 {
32 if (arr)
33 {
34 free(arr);
35 arr = NULL;
36 }
37
38 return 0;
39 }
40
41 // 将val添加到栈中
42 void push(int val)
43 {
44 arr[count++] = val;
45 }
46
47 // 返回“栈顶元素值”
48 int peek()
49 {
50 return arr[count-1];
51 }
52
53 // 返回“栈顶元素值”,并删除“栈顶元素”
54 int pop()
55 {
56 int ret = arr[count-1];
57 count--;
58 return ret;
59 }
60
61 // 返回“栈”的大小
62 int size()
63 {
64 return count;
65 }
66
67 // 返回“栈”是否为空
68 int is_empty()
69 {
70 return size()==0;
71 }
72
73 // 打印“栈”
74 void print_array_stack()
75 {
76 if (is_empty())
77 {
78 printf("stack is Empty\n");
79 return ;
80 }
81
82 printf("stack size()=%d\n", size());
83
84 int i=size()-1;
85 while (i>=0)
86 {
87 printf("%d\n", arr[i]);
88 i--;
89 }
90 }
91
92
93 void main()
94 {
95 int tmp=0;
96
97 // 创建“栈”
98 create_array_stack(12);
99
100 // 将10, 20, 30 依次推入栈中
101 push(10);
102 push(20);
103 push(30);
104
105 //print_array_stack(); // 打印栈
106
107 // 将“栈顶元素”赋值给tmp,并删除“栈顶元素”
108 tmp = pop();
109 printf("tmp=%d\n", tmp);
110 //print_array_stack(); // 打印栈
111
112 // 只将“栈顶”赋值给tmp,不删除该元素.
113 tmp = peek();
114 printf("tmp=%d\n", tmp);
115 //print_array_stack(); // 打印栈
116
117 push(40);
118 print_array_stack(); // 打印栈
119
120 // 销毁栈
121 destroy_array_stack();
122 }