鏈棧

hello,你們好,又見面了,我是大家的老朋友隨 . . .風,今天咱們來說講鏈棧的定義,壓棧和彈棧node

首先,咱們須要定義一下頭文件,由於用到了malloc函數,因此除了經常使用的<stdio.h>以外,咱們還須要一個<stdlib.h>。數組

以後,由於咱們在以後會用到返回值OK和ERROR,因此能夠先預約義一下數據結構

    #define OK 1
    #define ERROR 0函數

而後還須要轉換一下類型指針

    typedef int elemtype;
    typedef int status;內存

其實用int也行,可是這個格式更符合數據結構的樣子io

 

1.定義鏈棧變量

一個鏈棧須要定義些什麼呢。咱們來想想,棧,先進後出的一種結構,那確定就會有一個數據,而後怎麼肯定先後關係呢,next

就要用到指針了,也就是咱們說的結點。數據

typedef struct node{
elemtype data;                    //這個是數據元素
struct node*next;                 //這個就是咱們的結點了
}Snode,*linkstack;               //爲何這裏會用到兩個呢,第一個是真正的鏈棧稱呼,可是咱們用第二個就可使用它的地址了(希望是這樣理解的)

而後我在這裏提一下主函數的事情,你們可能看到書上的在定義結點後會出現定義子函數的狀況,這確定是OK的,爲何會直接在這裏定義子函數呢,由於你直接寫main函數的話,前面不定義,函數運行到main了,它不知道你寫的這個函數是什麼,它就報錯了,因此要麼在主函數前面寫子函數,要麼就先定義。

2.壓棧

什麼叫壓棧,其實就是咱們經常說的插入,不過是插入在最前面,也就是咱們的 top ,你們想一下,怎麼插入,首先,是否是要分配一個地址給咱們新定義的 top ,而後就把咱們要插進去的值傳給 top ,再把 top 和原來的鏈棧鉤起來就行了,而後把地址傳給咱們最初的棧就好啦 

status push(linkstack *S,elemtype e)
{

  linkstack top;
  top=(linkstack)malloc(sizeof(Snode));         //這個就是內存分配函數 
  if(!top)return ERROR;                                  //若是電腦沒得內存分配給咱們,咱們就只能默默的退出去了  
  top->data=e;
  top->next=*S;
  *S=top;                                                         //爲何這裏是*S呢,地址傳輸不是直接等於就行了嗎?你們看看咱們的函數定義,是否是有一個*S,前面咱們說過了linkstack是一個地址,那咱們再*S,是否是就變成了二級指針了呢,二級指針的地址轉換,就不是一級指針直接等於就行了
  return OK;

}

3.彈棧

什麼叫彈棧,顧名思義,就是把一個元素彈出來,那是哪一個元素呢,你們想一下,咱們的棧是先進後出的結構,就像一幅牌,你一張一張的把它放在桌子上,而後只能一張一張的拿,你是否是隻能從最後放的那張開始,這就是棧。那咱們也就知道咱們彈的是哪個元素了,沒錯,就是最後放進來的那個。怎麼刪除一個在最後面的元素呢,能夠用p->next一直指下去,直到出現NULL爲止,就找到了咱們的最後一個元素,也能夠一開始就設置一個尾結點,可是,可是,你們看看咱們的壓棧函數,咱們是逆序輸入的哦,也就是說咱們的頭指針一直指向咱們最後輸入的一個元素,因此就很簡單了(函數名我就不寫了)

  linkstack top;
  top=*S;
  *e=top->data;
  *S=top->next;                            //讓S指向下一個元素,就達到了刪除的目的
  free(top);                                    //記住要free,否則那個空間就浪費了
  return OK;

 

好了,就到這裏結束啦,呸呸呸,再幫大家寫一個printf函數,否則一直在主函數裏輸出,會顯得主函數很亂,主函數越簡潔越好

4.輸出函數

 

再談一下咱們的壓棧,咱們是逆序輸入的對吧,那怎麼作到順序輸出呢,第一能夠設置一個尾結點,而後從後面往前找,第二,咱們能夠利用一個數組,進行他的賦值,而後逆序輸出數組,二者複雜度差很少,看本身喜歡哪一個吧,下面給你們講一下數組的(是我太喜歡數組了,哎)

  linkstack p;
  int i=0,a[10];                                         //定義一個整型的數組,10也行,100也行,也能夠在壓棧那裏設置一個總元素變量,而後而後把那個值返回出來
  p=S;                                                     
  while(p->next!=NULL)                         //這裏就是給數組賦值了
  {
  a[i]=p->data;
  p=p->next;
  ++i;
  }
  i=i-1;                                                     //關於這裏爲何要i-1,老師說是一開始定義的a[10],那麼它就自帶了一個地址,逆序的話就會先把地址輸出來,我這裏取巧的直接給它-1了,哈哈,懂的同窗歡迎留言,謝謝
  for(;i>=0;--i)   
  {
  printf("%d ",a[i]);
  }
  printf("\n");

好了,鏈棧的壓棧和彈棧就到這裏結束了,你們下期再見!!!

相關文章
相關標籤/搜索