算 資料結構與演算法(C語言) 棧和佇列 棧

2021-09-12 23:33:16 字數 3162 閱讀 9083

棧是一種重要的線性結構,通常稱,棧和佇列是限定插入和刪除只能在表的「端點」進行的線性表。(後進先出)

–棧的元素必須「後進先出」。

–棧的操作只能在這個線性表的表尾進行。

–注:對於棧來說,這個表尾稱為棧的棧頂(top),相應的表頭稱為棧底(bottom)。

•因為棧的本質是乙個線性表,線性表有兩種儲存形式,那麼棧也有分為棧的順序儲存結構和棧的鏈式儲存結構。

•最開始棧中不含有任何資料,叫做空棧,此時棧頂就是棧底。然後資料從棧頂進入,棧頂棧底分離,整個棧的當前容量變大。資料出棧時從棧頂彈出,棧頂下移,整個棧的當前容量變小。

//棧的順序儲存結構

typedef struct

sqstack;

順序棧//----- 棧的動態分配順序儲存結構 -----

#define stack_init_size 100   //順序棧初始容量

#define stackincrement  10     //順序棧容量增量

typedef struct sqstack;

初始化//----- 基本操作的演算法描述 -----

status initstack( sqstack &s ) //initstack

返回棧頂元素

status gettop( sqstack s, selemtype &e ) //gettop

壓入棧status push( sqstack &s,  selemtype e )

*s.top++ = e;  

return ok;

}//push

彈出棧status pop( sqstack s, selemtype &e ) //pop

注:c語言中->和.的區別——->用於指標, .用於物件

"->"用於指向結構成員,它的左邊應為指向該結構型別的指標(結構指標),而"."的左邊應為該結構型別的變數(結構變數),如已定義了乙個結構體struct student,裡面有乙個int a;然後有乙個結構體變數struct student stu及結構體變數指標struct student *p;且有p=&stu,那麼p->a和stu.a表示同乙個意思。

例項分析:

•題目:利用棧的資料結構特點,將二進位制轉換為十進位制數。

•分析:地球人都知道,二進位制數是計算機資料的儲存形式,它是由一串0和1組成的,每個二進位制數轉換成相應的十進位制數方法如下:

(xnxn-1……x3x2x1)2 = x1*2^0+x2*2^1+…+xn*2^(n-1)

•乙個二進位制數要轉換為相應的十進位制數,就是從最低位起用每一位去乘以對應位的積,也就是說用第n位去乘以2^(n-1),然後全部加起來。

由於棧具有後進先出的特性,例如我們輸入11001001這樣的二進位制數

#include

#include

#include

#define stack_init_size 20

#define stackincrement 10

typedef char elemtype;

typedef struct

sqstack;

void initstack(sqstack *s)

s->top = s->base;

s->stacksize = stack_init_size;

}void push(sqstack *s,elemtype e)

s->top = s->base + s->stacksize;

s->stacksize = s->stacksize + stackincrement;

}*(s->top) = e;

s->top++;

}void pop(sqstack *s,elemtype *e)

*e = *--(s->top);

}int stacklen(sqstack s)

int main()

//清理鍵盤緩衝區 回車的ascii=10

getchar();

len = stacklen(s);

printf("棧的當前容量是:%d\n",len);

for(i=0; i二進位制轉化為八進位制、二進位制轉化為十六進製制:

二進位制每三位轉化為乙個八進位制

修改一下以上的主函式部分:

int main()

getchar();      // 把'\n'從緩衝區去掉

len = stacklen(s1);

initstack(&s2); // 初始化棧s2,用來存放轉換的八進位制

for( i=0; i < len; i+=3 )

}push( &s2, sum+48 );

sum = 0;

}printf("\n轉化為八進位制數是: ");

while( s2.base != s2.top )

printf("(o)\n");

return 0;

}二進位制每四位有乙個十六進製制與之呼應

int main()

getchar();      // 把'\n'從緩衝區去掉

len = stacklen(s1);

initstack(&s2); // 初始化棧s2,用來存放轉換的八進位制

for( i=0; i < len; i+=4 )

}switch( sum )

push( &s2, sum );

sum = 0;

}printf("\n轉化為十六進製制數是: ");

while( s2.base != s2.top )

printf("(h)\n");

return 0;

}鏈式棧

teypedef struct stacknode

stacknode, *linkstackptr;

teypedef struct linkstack

實踐:計算數學表示式(1-2)*(4+5)

簡介:逆波蘭表示式

——後來,在20世紀三十年代,波蘭邏輯學家jan.lukasiewicz不知道是像牛頓一樣被蘋果砸到腦袋而想到萬有引力原理,或者還是像阿基公尺德泡在浴缸裡突發奇想給皇冠是否純金做驗證,總之他也是靈感閃現了,然後發明了一種不需要括號的字尾表示式,我們通常把它稱為逆波蘭表示式(rpn) 。

•如果用逆波蘭表示法,應該是這樣:1 2 – 4 5 + *

實現對逆波蘭輸入的表示式進行計算,並且支援帶小數點的資料。

資料結構與演算法(C語言) 棧和佇列 佇列

與棧相反,佇列是一種先進先出 first in first out,fifo 的線性表。只允許在表尾一端進行插入操作而在表頭一端進行刪除操作。佇列既可以用鍊錶實現,也可以用順序表實現。跟棧相反的是,棧一般我們用順序表來實現,而佇列我們常用鍊錶來實現,簡稱為鏈佇列。佇列的鏈式表示和實現 typedef...

資料結構 棧與佇列(C語言)

2.迴圈佇列的實現 總結本文就介紹了資料結構中兩大基礎儲存結構,棧與佇列的基礎內容。棧 stack 又名堆疊,它是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。這一端被稱為棧頂,相對地,把另一端稱為棧底。向乙個棧插入新元素又稱作進棧 入棧或壓棧,它是把新元素放到棧頂元素的上面,使之成...

資料結構與演算法 棧和佇列

棧 是限制在表的一端進行插入和刪除運算的線性表。棧又稱後進先出簡稱lifo表 佇列 也是一種運算受限的線性表。它只允許在標的一端進行插入,而在另一端進行刪除。佇列亦稱先進先出fifo表 1.棧與佇列的區別 1 佇列先進先出,棧先進後出。2 對插入和刪除操作的 限定 棧是限定只能在表的一端進行插入和刪...