二. 棧, 隊數(shù)據(jù)結(jié)構(gòu)

Stack

第一種定義(推薦, 可以實現(xiàn)動態(tài)分配Stack SIZE)

typedef struct {
  ElemType *base;    //用指針指明stack base;
  int top;    //標記出stack top;
  int stacksize;    //當前已經(jīng)分配的存儲空間, 以元素為單位; 類似于MAXSIZE概念
}SqStack;
  • 從第一種定義看出, 求當前stack length可以直接(top-base)/sizeof(ElemType) (不用+1, 因為top指向了下一位);

第二種定義(定死Stack的SIZE)

typedef struct {
  ElemType stack[MAXSIZE];    //直接定義一個數(shù)組, 定死了內(nèi)存
  int top;    //標記出stack top;
} SqStack;
  • 從第二種定義, 我們可以看出stack length可以直接top得出(top指向的是空的下一位, 但是stack數(shù)組從stack[0]開始, 因為stack-length = top-1-0+1 = top);
/*構(gòu)造空棧*/
//要顧及到各個struct中的各個參數(shù)如base, top, stacksize;
Status InitStack(SqStack *S) {
    S->base = (ElemType *)malloc(SIZE*sizeof(ElemType));
    S->stacksize = SIZE;
    S->top = 0; 
    return 0;
}

/*GetTop*/
//先檢查是否為空棧, 不是才可以輸出base[top-1];
ElemType GetTop(SqStack *S) {
    if (S->top==0) {printf("GetTop UNDERFLOW\n"); return ERROR;}
    else {return S->base[S->top-1];}
}

/*Pop*/
//先檢查是否為空棧, 不是才可以用top--來縮減棧的高度;
Status Pop(SqStack *S) {
    if (S->top==0) {printf("Pop UNDERFLOW\n"); return ERROR;}
    else {S->top--; return 0;}
}

/**/
//先檢查是否棧滿了, 滿了就realloc內(nèi)存, 然后才可以push e到top原來位置, 然后讓top上浮一位;
Status Push (SqStack *S, ElemType e) {
    if (S->top >= SIZE) {
        S->base = (ElemType *)realloc(S->base,(SIZE+INCREMENT)*sizeof(ElemType));
        S->stacksize += INCREMENT;
        if (!S->base) {printf("Push OVERFLOW\n"); exit(OVERFLOW);}
    }
    S->base[S->top] = e;
    S->top++;
    return 0;
}

Queue

typedef struct {
    ElemType *base;  //最好不要寫死容量, 以適應不同大小的輸入
    int front, rear;
    int length;    //應對隊列頭減少而尾部到頂?shù)那樾? 必須計數(shù)num來實現(xiàn)不浪費空間; stack沒有這個問題, length直接top值就是了; 
    int queuesize; 
}SqQueue;

/*GetFront*/
//先檢查是否length==0, 然后再取base[front]
ElemType GetFront(SqQueue *Q) {
    if (Q->length==0) {
        printf("GetFront UNDERFLOW\n"); return ERROR;
    } else {
        return Q->base[Q->front];
    }
}

//先檢查Q是否是空的, 非空才把front往后移動一個位置;
Status DeQueue(SqQueue *Q) {
    if (Q->length==0) {
        printf("DeQueue UNDERFLOW\n"); return ERROR;
    } else {
        Q->front++;
    }
}

//先檢查Q是否是滿的, 非滿的再添加, 別忘了rear, length都要++
Status EnQueue(SqQueue *Q, ElemType e) {
    if (Q->length==SIZE) {
        //動態(tài)分配內(nèi)存
        Q->base = (ElemType *)realloc(Q->base,(SIZE+INCREMENT)*sizeof(ElemType));
        Q->queuesize += INCREMENT;
        if (!Q->base) {printf("EnQueue OVERFLOW\n"); exit(OVERFLOW);}
    }
    Q->base[Q->rear] = e;
    Q->rear++;
    Q->length++;
    printf("rear: %d\n",Q->rear);
    return 0;
}

后記: queue的數(shù)據(jù)結(jié)構(gòu)定義和stack基本一個套路, 都是采用順序線性表的定義方式(*elem, length, listsize→stack/queue(數(shù)組名就是指針), top/front,rear, length, size (top本身包含了計算length的方法))

DFS和棧, BFS和隊列

棧和隊列是簡單, 使用的數(shù)據(jù)結(jié)構(gòu), 運用范圍很廣.
圖算法中最基本的DFS和BFS算法的實現(xiàn)分別依靠棧和隊列.
相關(guān)算法代碼可以參考我的圖算法文章.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塔粒,一起剝皮案震驚了整個濱河市禀忆,隨后出現(xiàn)的幾起案子羡蛾,更是在濱河造成了極大的恐慌批幌,老刑警劉巖丐巫,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牍蜂,死亡現(xiàn)場離奇詭異厂置,居然都是意外死亡,警方通過查閱死者的電腦和手機到踏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門杠袱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人窝稿,你說我怎么就攤上這事楣富。” “怎么了伴榔?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵纹蝴,是天一觀的道長。 經(jīng)常有香客問我踪少,道長塘安,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任秉馏,我火速辦了婚禮耙旦,結(jié)果婚禮上脱羡,老公的妹妹穿的比我還像新娘萝究。我一直安慰自己,他們只是感情好锉罐,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布帆竹。 她就那樣靜靜地躺著,像睡著了一般脓规。 火紅的嫁衣襯著肌膚如雪栽连。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天侨舆,我揣著相機與錄音秒紧,去河邊找鬼。 笑死挨下,一個胖子當著我的面吹牛熔恢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臭笆,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼叙淌,長吁一口氣:“原來是場噩夢啊……” “哼秤掌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹰霍,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闻鉴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茂洒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孟岛,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年督勺,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚀苛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡玷氏,死狀恐怖堵未,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盏触,我是刑警寧澤渗蟹,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站赞辩,受9級特大地震影響雌芽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辨嗽,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一世落、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糟需,春花似錦屉佳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至杈帐,卻和暖如春体箕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背挑童。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工累铅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人站叼。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓娃兽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親大年。 傳聞我的和親對象是個殘疾皇子换薄,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容