你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言栈——图文解析

[复制链接]
gaosmile 发布时间:2020-9-6 21:07
栈的介绍. b# F$ i& F6 {+ t3 H8 S

6 Z' Q1 j; F; Y$ r4 X
. x% z% Z- M% k# @) l, c
栈(stack),是一种线性存储结构,它有以下几个特点:
  • 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的。
  • 向栈中添加/删除数据时,只能从栈顶进行操作。
    & Y, `8 a' V& n& P! `
8 \6 R* [* e' v
栈通常包括的三种操作:push、peek、pop。
  • push——向栈中添加元素。
  • peek——返回栈顶元素。
  • pop——返回并删除栈顶元素的操作。

    ( i  ?* ?+ V1 [. g) u2 {$ Y7 w
  q$ ~2 H1 a8 E
1. 栈的示意图
& O% _' V) p- H! Y$ T. f; {
微信图片_20200906205907.jpg

$ s0 y+ k9 @' g9 A1 |+ o4 a0 v/ b
栈中的数据依次是30→20→10。

2 _0 k( T3 a$ @1 f
2. 出栈

- R! C: j# ]; \, ^# [! t
微信图片_20200906205913.jpg

3 l* v- {! n% X# _0 Z) ]
出栈前:栈顶元素是30。此时,栈中的元素依次是30→20→10。
! a2 l( C2 p* y( M
出栈后:30出栈之后,栈顶元素变成20。此时,栈中的元素依次是20→10。

; z! O3 w& c( c1 Q4 g$ E6 S
3. 入栈

8 u9 r; Z3 _+ B+ ]! b6 a
微信图片_20200906205919.jpg
* E4 N# ?4 v  K5 U& i2 f
入栈前:栈顶元素是20。此时,栈中的元素依次是20→10。

5 F/ a- u0 z+ `2 ]4 E4 |! r: l
入栈后:40入栈之后,栈顶元素变成40。此时,栈中的元素依次是 40→20→10。
+ `4 h! N, g* U3 u1 i6 H
8 `0 C/ q% t4 `; z# l- {" ^+ v
栈的C实现
2 ?' v/ I) M$ K5 p% [4 }! F0 A- o1 @) w
  W1 E  g7 T3 z( v1 E" y3 ?
1数组实现的栈,并且只能存储int数据
( m9 }1 w- v2 J1 j7 ~1 x$ M
实现代码:

9 @8 \5 E; h/ V. N$ G
微信图片_20200906205925.jpg
  Y1 @2 P1 p/ d" z
运行结果:

  1. & I8 A# d$ C! D; T, J! [
  2. tmp=30
    ( Q) Z$ b% s& u4 P0 H4 b
  3. tmp=20
    % i9 d$ W; s9 c2 l4 P/ |; c. b
  4. stack size()=36 S) u/ X: X- g+ u0 H/ n( q1 G
  5. 40/ w' [6 {2 f9 U/ ?; U
  6. 20
    2 T2 q0 z6 v0 O/ _
  7. 10
复制代码
    4 V( ?/ Z) j4 r" r
    结果说明:该示例中的栈,是通过"数组"来实现的!
  • , b. Q# [+ K: N8 t7 g
; y3 O5 g( U% u
: O" k  u6 h+ V% l/ }* R
由于代码中已经给出了详细了注释,这里就不再对函数进行说明了。仅对主函数main的逻辑进行简单介绍:
  • 在主函数main中,先将 "10, 20, 30"依次压入栈。此时,栈的数据是:30→20→10。
  • 接着通过pop()返回栈顶元素;pop()操作并不会改变栈中的数据。此时,栈的数据依然是:30→20→10。
  • 接着通过peek()返回并删除栈顶元素。peek操作之后,栈的数据是:20→10。接着通过push(40)将40压
  • 入栈中。push(40)操作之后,栈的数据是:40→20→10。

    ) ~$ y2 O* |7 j1 S. K7 w
" z, U0 S( C& ~, ~& \4 P5 L' I# ]
2单向链表实现的栈,并且只能存储int数据

9 i% u/ j6 ~* W4 {8 x4 ?8 d
实现代码:
; v7 X1 ~3 h% ~: [  K& r
微信图片_20200906205931.jpg
5 R) t$ C9 N/ `) D, G+ K
代码说明:"运行结果" 以及 "主函数main的逻辑"都和"C语言实现一"的一样。不同的是,该示例中的栈是通过单向链表实现的。
: P; u3 Q2 y$ x- w) Z$ G
3双向链表实现的栈,并且只能存储int数据
! _" O$ C2 P7 {2 r4 _/ ^: o, [
实现代码:
4 a$ Z/ G& d. j$ L, E# J6 J, A2 t
(1)双向链表的头文件(double_link.h)

. N" T. w$ _: Y% U. T# u# L# c( W
微信图片_20200906205936.jpg

* L5 C! P6 J0 m9 {+ C, x4 Y7 h' r
(2)双向链表的实现文件double_link.c)

0 ~7 |1 j: w% e9 Q9 n9 }% V
微信图片_20200906205942.jpg
微信图片_20200906205948.jpg
微信图片_20200906205955.jpg

, A( p- i# _; G' C2 T, r* L0 S& g
(3)双向链表的测试程序(dlink_stack.c)

; M  k) D7 |! t# p
微信图片_20200906210002.jpg
* D" ?2 }& y4 ?, |0 I5 A8 A
代码说明:"运行结果" 以及 "主函数main的逻辑"都和前两个示例的一样。不同的是,该示例中的栈是通过双向链表实现的。

5 }5 X5 `$ y" n* G1 S
4双向链表实现的栈,能存储任意类型的数据
3 x: T1 y9 a/ g. ^  O/ {- K
实现代码:

% ^3 [9 U! @" x. U1 w% i
(1)双向链表的头文件(double_link.h)

: s0 ^$ z0 G2 V% B3 V* ?4 f. q" y
微信图片_20200906210008.jpg
% L, h& z6 o$ E! n0 D2 g
(2)双向链表的实现文件(double_link.c)
$ d7 I6 m6 q  ~( r
微信图片_20200906210016.jpg
微信图片_20200906210037.jpg
微信图片_20200906210024.jpg
微信图片_20200906210031.jpg
0 a% D- j9 u; T
(3)双向链表的测试程序(dlink_stack.c)
3 ?" I3 c+ \7 y" s
微信图片_20200906210043.jpg
2 _4 p& }4 y0 d* p2 N" R' E$ s
运行结果:

  1. 4 C6 U  N( V- w% [$ e% i
  2. id=40, name=dan- j  w8 |. ]% }( S' v& [
  3. id=20, name=jody( s) @7 K( w0 ~* l
  4. id=10, name=sky
复制代码
: Z! Y9 r: t5 r8 o
# s$ Z& D7 d5 {! k
结果说明:该示例中的栈是通过双向链表实现的,并且能存储任意类型的数据。示例中是以结构体类型的数据进行演示的,由于代码中已经给出了详细的注释,这里就不再介绍了。

3 T+ }/ Y' |$ V# G
赞 收藏 1 评论0 发布时间:2020-9-6 21:07

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版