隊列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。隊列的數(shù)據(jù)元素又稱為隊列元素。在隊列中插入一個隊列元素稱為入隊,從隊列中刪除一個隊列元素稱為出隊。因為隊列只允許在一端插入,在另一端刪除,所以只有最早進入隊列的元素才能最先從隊列中刪除,故隊列又稱為先進先出(FIFO—first in first out)線性表。
順序隊列代碼實現(xiàn):
#include <stdio.h>#define MAX 10typedef struct Queue{ int date[MAX]; int front; int tial;}queue;queue a;void IniQueue() //初始化{ a.tial = 0; a.front = 0;}int isEmpty(){ if(a.front == 0) //隊列為空 { return 1; } else { return 0; }}int push_Queue(int data) //入隊{ if(a.front == MAX-1) //隊列已滿 { return 1; } else { a.date[a.front] = data; } a.front++; return 0;}int pop_Queue() //出隊{ if(!isEmpty()) //不為空 { a.date[a.front--]; // printf("%d\n",a.front); } return 0;}void show() //遍歷{ int i = 0; for(i = 0; i < a.front;i++ ) { printf("%d\n",a.date[i]); }}int main(void){ printf("Hello World!\n"); push_Queue(1); push_Queue(2); push_Queue(3); push_Queue(4); push_Queue(5); push_Queue(6); push_Queue(7); show(); puts("=================="); pop_Queue(); show(); return 0;}
循環(huán)隊列
在實際使用隊列時,為了使隊列空間能重復(fù)使用,往往對隊列的使用方法稍加改進:無論插入或刪除,一旦rear指針增1或front指針增1 時超出了所分配的隊列空間,就讓它指向這片連續(xù)空間的起始位置。自己真從MaxSize-1增1變到0,可用取余運算rear%MaxSize和front%MaxSize來實現(xiàn)。這實際上是把隊列空間想象成一個環(huán)形空間,環(huán)形空間中的存儲單元循環(huán)使用,用這種方法管理的隊列也就稱為循環(huán)隊列。除了一些簡單應(yīng)用之外,真正實用的隊列是循環(huán)隊列。
在循環(huán)隊列中,當(dāng)隊列為空時,有front=rear,而當(dāng)所有隊列空間全占滿時,也有front=rear。為了區(qū)別這兩種情況,規(guī)定循環(huán)隊列最多只能有MaxSize-1個隊列元素,當(dāng)循環(huán)隊列中只剩下一個空存儲單元時,隊列就已經(jīng)滿了。因此,隊列判空的條件時front=rear,而隊列判滿的條件時front=(rear+1)%MaxSize。
#include <stdio.h>#define MAX 1000typedef struct Queues{ int date[MAX]; int front;//頭 int tail;//尾}Queue;Queue queue;void CreatQueue(){ queue.front = 0; queue.tail = 0;}void push_back(int vaule) //入隊{ if((queue.tail +1)%MAX != queue.front)//隊列未滿 { queue.tail = (queue.tail+1)%MAX;//因為少用一個,加1,才到尾;//%MAX是為了提高準確度 queue.date[queue.tail] = vaule; } else { printf("full\n"); }}int pop_Queue() //出隊{ if(queue.front != queue.tail)//隊列不為空 { int vaule = queue.date[queue.front+1];//先進先出 queue.front = (queue.front+1)%MAX; return vaule; } return 0;}int main(){ CreatQueue(); int i = 0; for(i = 1;i <= 5;i++) { push_back(i); printf("%d\n",queue.date[i]); } printf("==============\n"); for(i = 1;i <= 5;i++) { printf("%d\n",pop_Queue()); } return 0;}
棧作為一種數(shù)據(jù)結(jié)構(gòu),是一種只能在一端進行插入和刪除操作的特殊線性表。它按照先進后出的原則存儲數(shù)據(jù),先進入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時候從棧頂開始彈出數(shù)據(jù)(最后一個數(shù)據(jù)被第一個讀出來)。棧具有記憶作用,對棧的插入與刪除操作中,不需要改變棧底指針。
棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數(shù)為零時稱為空棧。插入一般稱為進棧(PUSH),刪除則稱為退棧(POP)。棧也稱為
后進先出表。
#include <stdio.h>#include <stdlib.h>typedef struct node //節(jié)點{ int member; struct node* next;}Node,*pNode;typedef struct stack{ pNode Top; //棧頂 pNode Buttom; //棧底}Stack,*pStack;void InitStack(pStack ps) //初始化棧{ ps->Top = (pNode)malloc(sizeof(Node)); if(NULL == ps) { printf("malloc error\n"); exit(-1); } else { ps->Buttom = ps->Top; ps->Top->next = NULL; }}int push_stack(pStack ps,int data) //壓棧{ pNode New = (pNode)malloc(sizeof(Node)); if(NULL == New) { printf("push_stack error\n"); return 0; } else { New->member = data; New->next = ps->Top; ps->Top = New; return 1; }}void ShowStack(pStack ps) //遍歷棧{ pNode New = ps->Top; while(New != ps->Buttom) { printf("%d\n",New->member); New = New->next; }}int Empty(pStack ps) //判斷棧是否為空{(diào) if(ps->Top == ps->Buttom) { printf("stack is NULL\n"); return 1; } else { printf("stack no NULL\n"); return 0; }}int pop_stack(pStack ps) //出棧{ pNode swap = NULL; int vaule = 0; if(1 == Empty(ps)) { exit(-1); } else { vaule = ps->Top->member; swap = ps->Top; ps->Top = ps->Top->next; free(swap); swap = NULL; return vaule; }}void clear(pStack ps) //清空棧{ pNode cnode = NULL; while(ps->Top != ps->Buttom) //棧不為空 { cnode = ps->Top; ps->Top = ps->Top->next; free(cnode); cnode = NULL; }}int main(){ Stack s; int i = 0; int num = 0; int data = 0; int re_num = 0; InitStack(&s); printf("Do you want how num?\n"); scanf("%d",&num); for(i = 0; i < num;i++) { printf("at %d num:",i+1); scanf("%d",&data); if(push_stack(&s,data)) { continue; } else { printf("push_stack error\n"); exit(-1); } } ShowStack(&s); return 0;}
編譯環(huán)境:Qt5.3.2
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。