面試筆記5棧和佇列

2021-08-28 11:27:54 字數 3189 閱讀 1415

1、棧(stack):先進後出的線性表,只能在一端做插入和移除,比如對於陣列(順序棧)必須在位置為0和最後乙個位置進行插入和刪除,對於乙個鍊錶(鏈式棧)來說:做頭部插入時,從頭部插入(push),從前面取出(pop)。鏈式棧和順序棧都是比較常用的棧。

程式:鏈式儲存

#include

#include

#include

struct charnode

;struct mystack

;int pushstack(struct mystack *pstack,char ch);

int popstack(struct mystack *pstack);//一旦把結點彈出,可以直接銷毀結點,或者返回節點的位址

int clearstack(struct mystack *pstack);//清空這個鍊錶

int isemptystack(strucy mystack *pstack);//是不是空表

int isfullstack(struct mystack *pstack);//判斷是不是滿

int printstack(struct mystack *pstack);//把鍊錶的內容進行列印

int main(int argc,char argv)

int pushstack(struct mystack *pstack,char ch);

if(isfullstack(pstack))

pstnew=(charnode *)malloc(sizeof(struct charnode));

if(pstnew==null)

pstnew->ch=ch;

pstnew->pstnext=null;

pstnew->pstnext=pstack->pstfist;

pstack->pstfirst=pstnew;

return 0;

pstack->len++;

}int popstack(struct mystack *pstack)//彈出鍊錶的第乙個結點

if(isemptystack(pstack))

pstnode=pstack->pstfirst;

pstack->pstfirst=pstnode->pstnext;

free(pstnode);

pstnode->pstnext=null;

pstack->len--;   

return 0;

}int clearstack(struct mystack *pstack);

pstnode=pstack->pstfirst;

while(pstnode!=null)

pstack->pstfirst=null;    

pstack->len=0

return -1;

}int isemptystack(struct mystack *pstack)

if(pstack->pstfirst==null)

else

int isfullstack(struct mystack *pstack)

if(pstack->len>=m)

else

return 0;

int printstack(struct mystack *pstack)

if(pstack->len<=0)

pout=(char *)malloc(sizeof(pstack->len+1));

if(pout==null)

memset(pout,0,pstack->len+1);

i=pstack->len-1;

while(pstnode!=null)

printf("the content is %s\n",pout);

return 0;

}2、佇列(queue):先進先出的線性表,只能在一端進行插入另一端進行移除。(很少用順序儲存(比較繁瑣),一般用鏈式儲存)

鏈式佇列:銀行服務視窗排隊,兩頭通的管子,先進的先出。即只能在佇列的一端插入(inqueue),另一端移除(dequeue)。第乙個結點移除,最後乙個結點刪除。

程式:單向鍊錶:

#include

#include

#include

struct clientnode

;struct bankqueue

;int destroybankqueue(struct bankqueue *psthead)//整個鍊錶銷毀成功,頭結點沒有動態分配所以不需要銷毀

pstnode=psthead->pstfirst;

if(pstnode!=null)

return 0;

}int enqueueclient(struct bankqueue *psthead,int no)//插入乙個結點,從尾部插入乙個節點

pstnew =(struct clientnode *)malloc(sizeof(struct clientnode));

if(null==pstnew)

pstnew->no=no;

pstnew->pstnext=    null;

if(psthead->pstlast!=null)

psthead->pstlast->pstnext=pstnew;

psthead->pstlast=pstnew;

else//表是空表

psthead->len++;

return 0;

}struct clientnode *dequeueclient(struct bankqueue *psthead)//移除乙個鍊錶,從頭部移除乙個結點

pstnode=psthead->pstfirst;

if(pstnode==null)

if(pstnode==psthead->pstlast)//頭部和尾部只有乙個結點

else//表是空表

pstnode->pstnext=null;

psthead->len--;

return pstnode;

}int main(int argc,char *argv)

;struct clientnode *pstnode=null;

while(quit)

case 3:

case 4:}}

return 0;

}int displaymainui()

{

面試筆記 資料結構 佇列與棧

1.佇列 佇列只允許從它的一端插入資料 隊尾 而從另一端取出資料 隊頭 一般情況下,習慣使用鍊錶作為佇列的儲存結構 typedef struct qnodeqnode,queueptr typedef struct linkqueue 上述 定義了乙個完整的佇列。qnode是佇列的結點型別,然後定義...

機試筆記8 棧與優先佇列

c 中棧可以 用stack 型別名 s來定義乙個棧,使用push和pop來進棧和出棧,使用empty 來判斷棧是否為空 棧的應用 括號匹配 在算術表示式中,除了加 減 乘 除等運算外,往往還有括號。包括有大括號 中括號,小括號 尖括號 等。對於每一對括號,必須先左邊括號,然後右邊括號 如果有多個括號...

棧和佇列5 鏈佇列

在鏈佇列中,head指向頭節點,但是實際的head是head指向的節點,即第乙個有元素的節點 tail在迴圈佇列中指向空位置,但是在鏈佇列中,tail指向最後乙個節點 和鏈棧一樣採取兩個結構體的形式 typedef struct queuenode qqueuenode,queueptr typed...