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...