棧數(shù)組代碼實(shí)現(xiàn):
#include<stdio.h> #include<stdlib.h> #include<string.h> #define maxn 10000 //結(jié)點(diǎn)設(shè)計(jì) typedef struct stack{ int data[maxn]; int top; }stack; //創(chuàng)建 stack *init(){ stack *s=(stack *)malloc(sizeof(stack)); if(s==NULL){ printf("分配內(nèi)存空間失敗"); exit(0); } memset(s->data,0,sizeof(s->data)); //memset操作來(lái)自于庫(kù)文件string.h,其表示將整個(gè)空間進(jìn)行初始化 //不理解可以查閱百度百科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"); //習(xí)慣性換行 } int main(){ stack *s=init(); int input[5]={11,22,33,44,55}; //模擬五個(gè)輸入數(shù)據(jù) for(int i=0;i<5;i++){ push(s,input[i]); } print_stack(s); ///////////// pop(s); print_stack(s); return 0; }
棧鏈表代碼實(shí)現(xiàn):
an#include <stdio.h> #include <stdlib.h> //棧的結(jié)點(diǎn)設(shè)計(jì) //單個(gè)結(jié)點(diǎn)設(shè)計(jì),數(shù)據(jù)和下一個(gè)指針 typedef struct node { int data; struct node *next; } Node; //利用上面的結(jié)點(diǎn)創(chuàng)建棧,分為指向頭結(jié)點(diǎn)的top指針和計(jì)數(shù)用的count typedef struct stack { Node *top; int count; } Link_Stack; //創(chuàng)建棧 Link_Stack *Creat_stack() { Link_Stack *p; //p = new Link_Stack; p=(Link_Stack*)malloc(sizeof(Link_Stack)); if(p==NULL){ printf("創(chuàng)建失敗,即將退出程序"); exit(0); } p->count = 0; p->top = NULL; return p; } //入棧 push Link_Stack *Push_stack(Link_Stack *p, int elem) { if (p == NULL) return NULL; Node *temp; temp=(Node*)malloc(sizeof(Node)); //temp = new Node; temp->data = elem; temp->next = p->top; p->top = temp; p->count++; return p; } //出棧 pop Link_Stack *Pop_stack(Link_Stack *p) { Node *temp; temp = p->top; if (p->top == NULL) { printf("錯(cuò)誤:棧為空"); return p; } else { p->top = p->top->next; free(temp); //delete temp; p->count--; return p; } } //遍歷棧:輸出棧中所有元素 int show_stack(Link_Stack *p) { Node *temp; temp = p->top; if (p->top == NULL) { printf(""); printf("錯(cuò)誤:棧為空"); return 0; } while (temp != NULL) { printf("%d\t", temp->data); temp = temp->next; } printf("\n"); return 0; } int main() { //用主函數(shù)測(cè)試一下功能 Link_Stack *p; p = Creat_stack(); int n = 5; int input[6] = {10,20,30,40,50,60}; /////////////以依次入棧的方式創(chuàng)建整個(gè)棧////////////// for(int i=0;i<n;i++){ Push_stack(p, input[i]); } show_stack(p); ////////////////////出棧/////////////////////// Pop_stack(p); show_stack(p); return 0; }
PS:棧的概念被極大量的運(yùn)用于各種程序設(shè)計(jì)之中,作為一種數(shù)據(jù)結(jié)構(gòu),其先進(jìn)后出的特殊性質(zhì)為很多算法的設(shè)計(jì)埋下伏筆,為之開通快車道。
C語(yǔ)言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競(jìng)賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語(yǔ)言學(xué)練課程
解決困擾你多年的C語(yǔ)言疑難雜癥特性的C語(yǔ)言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語(yǔ)法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競(jìng)賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程