棧??????????????????????????????????????????????????????????????????????
棧的特點是先進后出,一張圖簡單介紹一下。
#include "stdio.h" #include "math.h" #include "stdlib.h" #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10typedef char ElemType; typedef struct{ElemType *base;ElemType *top;int stacksize; }sqStack;void initStack(sqStack *s) {/*內存中開辟一段連續空間作為棧空間,首地址賦值給s->base*/s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));if(!s->base) exit(0); /*分配空間失敗*/s->top = s->base; /*最開始,棧頂就是棧底*/s->stacksize = STACK_INIT_SIZE; /*最大容量為STACK_INIT_SIZE */ } void Push(sqStack *s, ElemType e){if(s->top - s->base >= s->stacksize){/*棧滿,追加空間*/s->base = (ElemType *)realloc(s->base, (s->stacksize + STACKINCREMENT)*sizeof(ElemType));if(!s->base) exit(0); /*存儲分配失敗*/s->top = s->base + s->stacksize;s->stacksize = s->stacksize + STACKINCREMENT; /*設置棧的最大容量*/}*(s->top) = e; /*放入數據*/s->top++; }void Pop(sqStack *s , ElemType *e){if(s->top == s->base) return;//棧里面沒有元素了則返回 *e = *--(s->top); //刪除棧頂的元素 }int StackLen(sqStack s){return (s.top - s.base) ;//計算棧的長度 } void main() {ElemType c;sqStack s;int len , i , sum = 0;printf("Please input a Binary digit\n");initStack(&s); /*創建一個棧,用來存放二進制字符串*//*輸入0/1字符表示的二進制數,以#結束*/scanf("%c",&c);while(c!='#')//遇到#則結束{Push(&s,c);//輸入一個壓入一個scanf("%c",&c);}len = StackLen(s); /*得到棧中的元素個數,即二進制數的長度*/for(i=0;i<len;i++){Pop(&s,&c);sum = (int)(sum + (c-48) * pow(2,i)); /*轉換為十進制*/
//二進制轉十進制的算法 }printf("Decimal is %d\n",sum); }
隊列??????????????????????????????????????????????????????????????????
隊列的特點是先進先出,就跟我們平常排隊一個意思。
#include "stdio.h" #include "stdlib.h" typedef char ElemType; typedef struct QNode{ElemType data;struct QNode *next; } QNode , *QueuePtr; typedef struct{QueuePtr front; //隊頭指針QueuePtr rear; //隊尾指針 }LinkQueue;void initQueue(LinkQueue *q){/*初始化一個空隊列*/q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); /*創建一個頭結點,隊頭隊尾指針 指向該結點*/if( !q->front) exit(0); /*創建頭結點失敗*/q->front->next = NULL; /*頭結點指針域置NULL*/ }void EnQueue(LinkQueue *q, ElemType e){QueuePtr p;p = (QueuePtr)malloc(sizeof(QNode)); /*創建一個隊列元素結點*/if( !q->front) exit(0); /*創建頭結點失敗*/p->data = e;//元素節點寫入數據p->next = NULL;//元素節點的向后的指針指向空 q->rear ->next = p;//將隊列中的隊尾指針指向剛生成的元素節點q->rear = p; } void DeQueue(LinkQueue *q, ElemType *e){/*如果隊列q不為空,刪除q的隊頭元素,用e返回其值*/QueuePtr p;if(q->front == q->rear) return; /*隊列為空,返回*/p = q->front->next;//隊頭給p*e = p->data;//取出來的隊頭的數據 q->front->next = p->next;//取出來的隊頭的下一個指向給新的隊頭的指向if(q->rear == p) q->rear = q->front; /*如果隊頭就是隊尾,則修改隊尾指針*/free(p); } /*測試函數*/ void main() {ElemType e;LinkQueue q;initQueue(&q); /*初始化一個隊列q*/printf("Please input a string into a queue\n");scanf("%c",&e);while(e!='@'){EnQueue(&q,e); /*向隊列中輸入字符串,以@表示結束*/ scanf("%c",&e);}printf("The string into the queue is\n");while(q.front != q.rear){ /*將隊列中的元素出隊列,并打印在屏幕上*/DeQueue(&q,&e);printf("%c",e);}printf("\n"); }
?
?
本文轉自我愛物聯網博客園博客,原文鏈接:http://www.cnblogs.com/yydcdut/p/3667093.html,如需轉載請自行聯系原作者