妙趣横生的算法--栈和队列
栈
#include "stdio.h" #include "math.h" #include "stdlib.h" #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 typedef 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://yydcdut.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yydcdut.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。