C语言算法系列---1.队列和栈
写在前面:在家玩了好久,实在是不知道干嘛了,突然想找些事做,现在是时候做些什么了。这些东西不见得多高深,也可能很简单,但很基础,也无法忽视。同时,也是自己学习走过的一条路。
这是开头,就写写C的队列和栈的一些算法吧。
首先是栈的一些基础功能的实现,先贴代码:
#include<stdlib.h>
#include<stdio.h>
typedef int SElemType; //声明栈元素类型为int
typedef int Status; //函数返回值的类型为int
#define MAXSIZE 20 //栈的容量 typedef struct
{
SElemType data[MAXSIZE];
int top;
}SqStock ; Status InitStock(SqStock *); //栈初始化函数声明
Status push(SqStock *,SElemType); //入栈函数声明
Status pop(SqStock *,SElemType *); //出栈函数声明
void Conversion(); //这是当时测验的一个转换函数,顺带贴了 /************函数区*******/
//0.初始化
Status InitStock(SqStock *s){
int StockDataArray[MAXSIZE];
for(int i=;i<MAXSIZE;i++){
s->data[i]='\0';
}
s->top=-;
return ;
} //入栈
Status push(SqStock *s,SElemType e){
if(s->top==MAXSIZE-){ //已达最大容量
return ;
};
s->top++;
s->data[s->top]=e;
return ; } //出栈
Status pop(SqStock *s,SElemType *e){
if(s->top==-){//已到栈底
return ;
}
*e=s->data[s->top--];
return ;
} //转化为8进制
void Conversion(){
int N;
SqStock *s;
s=(SqStock *)malloc( sizeof( SqStock)); //申请内存空间
InitStock(s);
printf("请输入一个十进制整数:");
scanf("%d",&N);
while(N){ push(s,N%);
N=N/;
}
int e;
while(s->top!=-){
pop(s,&e);
printf("%d",e);
}
}
/************函数区*******/
上述代码思路:利用数组来实现栈的功能,平时用的时候完全直接使用数组和一个int型的top,其值为当前栈顶元素所在的下标。至于如何处理栈溢出的问题,要么将容量设置大一点,要么在快要溢出的时候动态申请一些内存空间。当然,肯定还有其他的方法,自己要有探索精神哦。
接着是队列的一些基本功能的算法:
#include <stdio.h>
#include <tchar.h>
#include<stdlib.h>
#include<math.h>
#include<time.h> #define MAXSIZE 20 typedef int QElemType;
typedef int Status;
//使用循环队列
typedef struct { QElemType Data[MAXSIZE];
int front;
int rear;
}XHQueue; int getRand(int ,int );//当时测试随机数的,两个变量是上下限
void InitQueue(XHQueue *); //初始化队列
Status EnQueue(XHQueue *,QElemType ); //入队
Status DeQueue(XHQueue *,QElemType *);//出队
Status IsEmpty(XHQueue *); //判断是否为空 /*****函数区***/
//产生随机函数
int getRand(int MinSize,int MMaxSize){
time_t t;
int r;
srand((unsigned)time(&t));
r=rand()%(MMaxSize-MinSize+)+MinSize;
return r;
} //队列初始化
void InitQueue(XHQueue *Q){
Q->front=;
Q->rear=; } //入队 Status EnQueue(XHQueue *Q,QElemType E){ if((Q->rear+)%MAXSIZE ==Q->front)//队列已满
{
return ;
}
Q->Data[Q->rear]=E;
Q->rear=(Q->rear+)%MAXSIZE;
return ;
} //出队
Status DeQueue(XHQueue *Q,QElemType *E){ //至于为什么是*E,去看看c的传值与传址,在使用的时候要写成DeQueue(Q ,&变量),传址符不能少
if(Q->front==Q->rear){//队列已空
return ;
}
*E=Q->Data[Q->front];
Q->front=(Q->front+)%MAXSIZE; return ; } //判断是否为空
Status IsEmpty(XHQueue *Q){
if(Q->front==Q->rear){
return ;
}
return ; }
/*****函数区***/ int _tmain(int argc, _TCHAR* argv[])
{
/*int r,r1;
r=getRand(20,35);
r1=getRand(20,40);
printf("%d %d\n",r,r1);*/ int Re;
XHQueue *Q;
Q=(XHQueue *)malloc(sizeof(XHQueue));
InitQueue(Q);
EnQueue(Q,);
EnQueue(Q,);
EnQueue(Q,);
EnQueue(Q,);
while(!IsEmpty(Q)){
DeQueue(Q,&Re);
printf("%d",Re);
} system("pause");
return ;
}
代码说明:原谅我比较懒。。好多都原封不动的贴上来了= =!从思路上来说,现实生活中的队列都是走一个,所有人往前移,但在程序中也写成这样,也不是不可以,但在队列比较长的时候,光移动这些元素就会花费大量的时间,是非常不划算的,所以,为了避免这样大规模的移动,使用循环队列的思想,即队头走了就走了,我们把队头指针往后移一个,队尾来人了,发现已经站不了了,那就去前面看看,前面说不定就能站呢。
恩暂时就贴这么多啦~改天有空再贴些其他的~
C语言算法系列---1.队列和栈的更多相关文章
- javascript实现数据结构与算法系列:队列 -- 链队列和循环队列实现及示例
1 队列的基本概念 队列(Queue):也是运算受限的线性表.是一种先进先出(First In First Out ,简称FIFO)的线性表.只允许在表的一端进行插入,而在另一端进行删除. 队首(fr ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- Swift 算法实战之路:栈和队列
这期的内容有点剑走偏锋,我们来讨论一下栈和队列.Swift语言中没有内设的栈和队列,很多扩展库中使用Generic Type来实现栈或是队列.笔者觉得最实用的实现方法是使用数组,本期主要内容有: 栈和 ...
- 算法<初级> - 第二章 队列、栈、哈希表相关问题
算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...
- 深入浅出数据结构C语言版(7)——特殊的表:队列与栈
从深入浅出数据结构(4)到(6),我们分别讨论了什么是表.什么是链表.为什么用链表以及如何用数组模拟链表(游标数组),而现在,我们要进入到对线性表(特意加了"线性"二字是因为存在多 ...
- 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
再次面对像栈和队列这样的相当基础的数据结构的学习,应该从多个方面,多维度去学习. 首先,这两个数据结构都是比较常用的,在标准库中都有对应的结构能够直接使用,所以第一个阶段应该是先学习直接来使用,下一个 ...
- 数据结构与算法(3)----->队列和栈
1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...
- 【数据结构(C语言版)系列三】 队列
队列的定义 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.这和我们日常生活中的排队是一致的,最早进入队列的元素最早离开.在队列中,允许插入的一端叫做队尾(rear),允许 ...
随机推荐
- WebService究竟是什么?
一.序言 大家或多或少都听过WebService(Web服务),有一段时间非常多计算机期刊.书籍和站点都大肆的提及和宣传WebService技术,当中不乏非常多吹嘘和做广告的成分.可是不得不承认的是W ...
- systemtap-与 oracle 转
https://baoz.net/using-systemtap/ http://nanxiao.me/category/%E6%8A%80%E6%9C%AF/systemtap-%E7%AC%94% ...
- [原创]SSIS-WMI 数据读取器任务:监控物理磁盘空间
背景: 随着时间的推移,我们的DW会越来越大,也就意味着磁盘空间会越来越小,那如果哪一天留意不当,就会造成磁盘空间的不足而导致ETL失败,最终影响我们的系统的数据正确性和使用,更严重的有可 ...
- URL请求过程
一.URL(Uniform Resource Locator)统一资源定位符,是可以从互联网上得到的资源的位置和访问方法的一种简洁表示,是互联网上标准资源的地址.互联网上的每一个文件都有一个唯一的UR ...
- IOS UIwebView 加载网络图片 使用相对地址
方法一: 在html文件内直接使用file:///user//xx//image.png的绝对路径 注:这样可以显示图片,但是如果在程序目录修改,图片就不能显示 方法二: 在html使用占位符,如:在 ...
- C#之结构化异常处理
1.异常处理4要素 一个表示异常详细信息的类类型: 一个向调用者引发异常类实例的成员: 调用者的一段调用异常成员的代码块: 调用者的一段处理将要发生异常的代码块:
- PHP实现遍历、复制、删除目录
一.遍历 opendir 具体函数我就不解释了,直接看代码理解: <?php header("Content-Type:Text/html;charset=utf8"); $ ...
- 【Android 界面效果28】Android应用中五种常用的menu
Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...
- iOS - UI - UIScrollView
1.UIScrollView 滚动视图 // 滚动视图 UIScrollView* scrollView = [[UIScrollView alloc]initWithFrame:self.view. ...
- 单例模式——Singleton
模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中 ...