1. 棧的基本操作—出棧
如圖:
出棧(pop)操作,是在棧不為空的情況下(注意一定要進行判空操作),將棧頂的元素刪除,同時top指針,next向下進行移動即可的操作。
其代碼可以表示為:
//出棧 pop Link_Stack *Pop_stack(Link_Stack *p) { Node *temp; temp = p->top; if (p->top == NULL) { printf("錯誤:棧為空"); return p; } else { p->top = p->top->next; free(temp); //delete temp; p->count--; return p; } }
2. 棧的基本操作—遍歷
棧的遍歷相對而言比較復雜,由于棧的特殊性質,其只允許在一端進行操作,所以我們的遍歷操作永遠都是逆序的,其過程為,在棧不為空的情況下,一次從棧頂元素向下訪問,直到指針指向空(即到棧尾)為結束。
其代碼可以表示為:
//遍歷棧:輸出棧中所有元素 int show_stack(Link_Stack *p) { Node *temp; temp = p->top; if (p->top == NULL) { printf(""); printf("錯誤:棧為空"); return 0; } while (temp != NULL) { printf("%d\t", temp->data); temp = temp->next; } printf("\n"); return 0; }
3. 快速棧實現--數組棧
數組棧是一種更為快速的模擬實現棧的方法,所謂模擬,就是不采用真實的鏈表設計,轉而采用數組的方式進行“模擬操作”,這是一種仿真類型的操作,其可以快速的幫助我們構建代碼,分析過程,相應的實現起來也更加的便捷。
其代碼如下(請參考上文進行自主分析):
#include<stdio.h> #include<stdlib.h> #include<string.h> #define maxn 10000 //結點設計 typedef struct stack{ int data[maxn]; int top; }stack; //創(chuàng)建 stack *init(){ stack *s=(stack *)malloc(sizeof(stack)); if(s==NULL){ printf("分配內存空間失敗"); exit(0); } memset(s->data,0,sizeof(s->data)); //memset操作來自于庫文件string.h,其表示將整個空間進行初始化 //不理解可以查閱百度百科https://baike.baidu.com/item/memset/4747579?fr=aladdin s->top=0; //棧的top和bottom均為0(表示為空) return s; } //入棧push void push(stack *s,int data){ s->data[s->top]=data; s->top++; } //出棧pop void pop(stack *s){ if(s->top!=0){ s->data[s->top]=0; //讓其回歸0模擬表示未初始化即可 s->top--; } } //模擬打印棧中元素 void print_stack(stack *s){ for(int n=s->top-1;n>=0;n--){ printf("%d\t",s->data[n]); } printf("\n"); //習慣性換行 } int main(){ stack *s=init(); int input[5]={11,22,33,44,55}; //模擬五個輸入數據 for(int i=0;i<5;i++){ push(s,input[i]); } print_stack(s); ///////////// pop(s); print_stack(s); return 0; }
4. 配套題目推薦
可以嘗試的去利用棧的思維實現一下進制轉換的題目
如十進制到八進制:1055題
十進制到二進制:1192題
或者可以嘗試一下利用遞歸棧的方式,將棧去代替函數遞歸實現一些功能(注意,這將會是DFS搜索算法的理解基礎)
如斐波那契數列:1131題
1055 | 二級C語言-進制轉換 |
1131 | C語言訓練-斐波納契數列 |
1192 | 十->二進制轉換 |
C語言網提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程