妙趣横生的算法--栈和队列
栈
栈的特点是先进后出,一张图简单介绍一下。
#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,如需转载请自行联系原作者
妙趣横生的算法--栈和队列相关推荐
- 数据结构与算法-栈与队列
数据结构与算法-栈与队列 栈 基本概念 简单表述就是仅在表尾进行插入和删除操作的线性表. 常见操作 入栈和出栈, 均在线性表的尾部进行. 基本原则就是, 先入后出. 队列 基本概念 和栈不同的是,队列 ...
- char栈java,Java数据结构与算法-栈和队列(示例代码)
(摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照"先进后出&qu ...
- 数据结构和算法——栈、队列、堆
文章目录 1.预备知识 1.1 栈 1.2 队列 1.3 堆 2.用队列实现栈 2.1 题目描述 2.2 解题思路 2.3 C++实现 3.用栈实现队列 3.1 题目描述 3.2 解题思路 3.3 C ...
- 数据结构与算法——栈、队列、堆汇总整理
目录 例1:使用队列实现栈(easy 栈.队列) 例2:使用栈实现队列(easy 栈.队列) 例3:包含min函数的栈(easy 栈) 例4:合法的出栈序列(medium 栈.队列) 例5:简单的计算 ...
- java判断栈中元素数目_Java数据结构与算法-栈和队列
(摘录加总结)------ 栈和队列不属于基础的数据结构,它们都属于线性表. 一.栈 对于栈存储操作元素只能在栈结构的一端进行元素的插入和删除,是一种性质上的线性表结构.按照"先进后出&qu ...
- python数据结构与算法——栈、队列与双端队列
栈 栈:是一种容器,可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端进行加入数据和输出数据的运算.没有了位置概念,保证任何时候可以访问.删除的元素都是此前最后存入的那个元素,确定了 ...
- 数据结构与算法——栈和队列定义和特点
- 数据结构与算法——栈和队列
- 数据结构与算法(二) 栈与队列(代码示例)
数据结构与算法 栈与队列 1. 数组和链表实现栈 2. 用O(1)的时间复杂度求栈中的最小元素 3. 链表和数组实现队列 4. 用两个栈模拟队列操作 1. 数组和链表实现栈 链表的方式: /*** 描 ...
最新文章
- android跑分和ios,安卓评分再高也没用吗 安卓与ios的区别
- Atom ctrl+atl+b 快捷键修复
- 200t不稳定_技术革新!将不可能变为可能 这家企业是怎么做到的?
- Docker下部署wordpress
- go还是python 知乎_知乎用Go替代Python
- AV系统类毕业论文文献有哪些?
- VMware Workstation 14.1.1 精简特别版
- ue编辑器漏洞_UEditor编辑器任意文件上传漏洞分析
- 「原创」如何快速获取银行、联行号的数据?
- 阿里巴巴 html圆代码,阿里巴巴国际站HTML代码全透视
- Gym 100818 F Irrational Roots (数学)
- 【数学建模】数学建模学习2---整数规划(例题+matlab代码实现)
- (旧)子数涵数·PS——冷色调与LOMO
- Android下操作FrameBuffer
- 一篇文章教会你使用Python抓取微博评论
- 仿iphone顶部状态栏_无需第三方APP,苹果iPhone手机屏幕录制的方法
- 2021-03-27 : Task05_DIN模型
- 两个乒乓球队进行比赛,各出3人。甲队为A,B,C三人,乙队为X,Y,Z3人。已抽签决定比赛名单。有人像队员打听比赛的名单,A说他不和X比,C说他不和X,Z比,请编程序找出3对赛手的名单
- 认识substrate
- python 渐变色_python – 用渐变颜色的散景散点图