在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ C/ 一起talk C栗子吧(第十六回:C語言實(shí)例--棧一)
一起talk C栗子吧(第八回:C語言實(shí)例--素?cái)?shù))
一起talk C栗子吧(第十八回:C語言實(shí)例--輸出十六進(jìn)制)
一起talk C栗子吧(第十七回:C語言實(shí)例--棧二)
一起talk C栗子吧(第十九回:C語言實(shí)例--位操作)
一起talk C栗子吧(第十六回:C語言實(shí)例--棧一)
一起talk C栗子吧(第五回:C語言實(shí)例--數(shù)組巧妙賦值)
一起talk C栗子吧(第十二回:C語言實(shí)例--單鏈表一)
一起talk C栗子吧(第九回:C語言實(shí)例--最大公約數(shù))
一起talk C栗子吧(第二回:C語言實(shí)例--判斷閏年)
一起talk C栗子吧(第六回:C語言實(shí)例--生成隨機(jī)數(shù))
一起talk C栗子吧(第四回:C語言實(shí)例--斐波那契數(shù)列)
一起talk C栗子吧(第十四回:C語言實(shí)例--循環(huán)鏈表)
一起talk C栗子吧(第十五回:C語言實(shí)例--雙向鏈表)
一起talk C栗子吧(第二十一回:C語言實(shí)例--表達(dá)式求值)
一起talk C栗子吧(第三回:C語言實(shí)例--求階乘)
一起talk C栗子吧(第七回:C語言實(shí)例--進(jìn)制轉(zhuǎn)換)
一起talk C栗子吧(第二十回:C語言實(shí)例--括號(hào)匹配)
一起talk C栗子吧(第一回:C語言實(shí)例概述)
一起talk C栗子吧(第十回:C語言實(shí)例--最小公倍數(shù))
一起talk C栗子吧(第十一回:C語言實(shí)例--文件組織結(jié)構(gòu))
一起talk C栗子吧(第十三回:C語言實(shí)例--單鏈表二)

一起talk C栗子吧(第十六回:C語言實(shí)例--棧一)

各位看官們,大家好,從今天開始,我們講大型章回體科技小說 :C栗子,也就是C語言實(shí)例。閑話休提, 言歸正轉(zhuǎn)。讓我們一起talk C栗子吧!

看官們,上一回中咱們說的是雙向鏈表的例子,這一回咱們說的例子是:棧。

什么是棧?我們聽過龍門客棧,你這個(gè)是哪家客棧?我還沒有說,臺(tái)下已經(jīng)有客官在問了??垂賯儯瑮J?類似我們?cè)谇懊鎺谆刂姓f過的鏈表,它也是用來存放數(shù)據(jù)的一種抽象的數(shù)據(jù)結(jié)構(gòu)。因?yàn)楸容^抽象,咱們還 是舉個(gè)現(xiàn)實(shí)生活中的例子來說明吧。我們出去旅游時(shí)通常拿一個(gè)行李箱存放自己的物品,比如衣服,鞋子 電腦,相機(jī)等。出發(fā)前,我們會(huì)把這些東西依次放到行李箱中,首先會(huì)把不容易壓壞的物品放到箱底,比 如衣服。然后把容易壓壞的物品放到上面,比如電腦和相機(jī)。當(dāng)我們到達(dá)目的地時(shí),會(huì)取出行李箱中的物 品。首先拿出放在箱子上面的電腦和相機(jī),最后拿出放在箱子底部的衣服。大家看看,拿出物品的順序和 存放物品的順序正好相反。最后放進(jìn)去的電腦和相機(jī)等易壓碎的物品最先拿出來,最先放進(jìn)去的衣服等不 易壓碎的物品最后拿出來。這個(gè)行李箱就好比一個(gè)存放數(shù)據(jù)的棧,箱子里面的物品好比數(shù)據(jù),從箱子里拿 物品好比操作數(shù)據(jù),拿物品要先拿最后存放的物品,操作數(shù)據(jù)也要先操作最后放到棧中的數(shù)據(jù)。就是說最 先存放到棧中的數(shù)據(jù)最后被拿出。這便是棧的特點(diǎn):先進(jìn)后出。

看官們,和鏈表一樣,棧也有兩種實(shí)現(xiàn)方式:順序存放和鏈?zhǔn)酱娣?。我們?huì)分別舉例子說明。棧有兩個(gè)基 本的操作:出棧和入棧。入棧就是把數(shù)據(jù)存放到棧中,出棧就是把數(shù)據(jù)從棧中拿出來。入棧和出棧這兩個(gè) 操作要符合?!跋冗M(jìn)后出”的特點(diǎn)。

看官們,詳細(xì)的代碼如下,大家可以參考。關(guān)于代碼中有一些需要注意的地方和大家說一下:

  • 1.棧的順序存儲(chǔ)是通過一個(gè)全局?jǐn)?shù)組實(shí)現(xiàn)的,棧的大小就也就是數(shù)組的長度,可以自己定義。
  • 2.入棧時(shí)要確認(rèn)棧是否已經(jīng)満了,不然會(huì)有溢出。我在代碼中多放了一個(gè)空間可以避免溢出。
  • 3.出棧時(shí)要確認(rèn)棧是否已經(jīng)空了,不然會(huì)有溢出。我在代碼中通過多放了一個(gè)變量size可以避免溢出。
       1  /* **************************
       2   * Head file of Stack
       3   * *************************/
       4  #ifndef STACK_H
       5  #define STACK_H
       6  
       7  #include<stdio.h>
       8  #include<stdlib.h>
       9  
      10  #define SUCCESS 0
      11  #define FAILE 1
      12  
      13  #define LEN 5 //棧的長度先定義為5,需要時(shí)可自行修改
      14  
      15  typedef int StackElmt; //把int當(dāng)作棧中元素的類型,實(shí)際中可以使用其它的類型或者自己定義一個(gè)List類型
      16  typedef struct _Stack{
      17      StackElmt *base;
      18      StackElmt *top;
      19      int size;
      20  }Stack;
      21  
      22  StackElmt STACK[LEN+1] = {0}; //順序存儲(chǔ)方式的棧,防止數(shù)組越界,最后一個(gè)位置不放元素
      23  
      24  //聲明函數(shù)原型,這里有入棧和出棧操的函數(shù)
      25  int StackInit(Stack *s);
      26  int StackPrint(Stack *s);
      27  int StackPush(Stack *s, StackElmt e);
      28  int StackPop(Stack *s, StackElmt *e);
      29  
      30  #endif /*STACK_H*/
     1  /* **************************
     2   * Soure file of Stack
     3   * *************************/
     4  
     5  #include"Stack1.h"
     6  
     7  //實(shí)現(xiàn)List的函數(shù),為了方便,放到了主函數(shù)所在的文件中,最好是單獨(dú)建立實(shí)現(xiàn)函數(shù)的源文件
     8  //初始化中棧
     9  int StackInit(Stack *s)
    10  {
    11      if(NULL == s)
    12          return FAILE;
    13  
    14      s->top = s->base = &STACK[0];
    15      s->size = 0;
    16  
    17  }
    18  //輸出棧中存放的元素
    19  int StackPrint(Stack *s)
    20  {
    21      int index = 0;
    22  
    23      if(NULL == s)
    24          return FAILE;
    25  
    26      if(s->size == 0)
    27      {
    28          printf("the Stack is empty,there is not any element \n");
    29          return FAILE;
    30      }
    31  
    32      while(index < (s->size))
    33      {
    34          printf("%d  ",*((s->base)+index) );
    35          index++;
    36      }
    37  
    38      printf("\n ");
    39  
    40      return SUCCESS;
    41  }
    42  
    43  //入棧函數(shù),top指向棧頂,先把元素入棧,然后向棧頂移動(dòng)一位
    44  int StackPush(Stack *s, StackElmt e)
    45  {
    46      if(NULL == s)
    47          return FAILE;
    48  
    49      if(s->size >= LEN)
    50      {
    51          printf("the Stack is full \n");
    52          return FAILE;
    53      }
    54  
    55      *(s->top) = e;
    56      (s->top)++;
    57      (s->size)++;
    58  
    59      return SUCCESS;
    60  }
    61  
    62  //出棧函數(shù),top先向棧底移到一位,然后移出當(dāng)前它所指向的元素
    63  int StackPop(Stack *s, StackElmt *e)
    64  {
    65      if(NULL == s)
    66          return FAILE;
    67  
    68      if(s->size == 0)
    69      {
    70          printf("the Stack is empty \n");
    71          return FAILE;
    72      }
    73  
    74      (s->top)--;
    75      *e = *(s->top);
    76      (s->size)--;
    77  
    78      return SUCCESS;
    79  }
    80  
    81  
    82  int main()
    83  {
    84      int i = 0;
    85      StackElmt e = 0;
    86      Stack stack ;
    87  
    88      if( SUCCESS == StackInit(&stack) )
    89          StackPrint(&stack);
    90  
    91      StackPush(&stack,7);
    92      StackPrint(&stack);
    93  
    94      StackPop(&stack,&e);
    95      printf("%d is poped \n",e);
    96  
    97      while(i++ < LEN+5)
    98      {
    99          if( SUCCESS == StackPush(&stack,i) )
   100              printf("%d is pushed \n",i);
   101      }
   102  
   103      while(i-- > 0)
   104      {
   105          if( SUCCESS == StackPop(&stack,&e) )
   106              printf("%d is poped \n",e);
   107      }
   108  
   109  }

各位看官,關(guān)于棧的例子咱們就說到這里。欲知后面還有什么例子,且聽下回分解。