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),允许 ...
随机推荐
- andorid
js内存泄露 三分面加七分水 —— 十分糊涂 膝盖上打瞌睡 —— 自己靠自己 不当家,不知柴米贵:不生子,不知父母恩. 水落现石头,日久见人心. sqllite http://wenku.baidu. ...
- Javascript实现鼠标框选元素后拖拽被框选的元素
之前需要做一个框选元素后拖拽被框选中的元素功能,在网上找资料做了一些修改,基本达到了需要的效果,希望对也需要实现框选后拖拽元素功能的人有用. 页面加载后效果 框选后的内容可以拖拽,如下图: 代码下载
- nginx多进程模型之配置热加载---转
http://blog.csdn.net/brainkick/article/details/7176405 前言: 服务器程序通常都会通过相应的配置文件来控制服务器的工作.很多情况下,配置文件会经常 ...
- Socket 之 c#实现Socket网络编程
一.命名空间: 在网络环境下,最有用的两个命名空间是System.Net和 System.Net.Sockets. 1.System.Net:通常与较高程的操作有关,例如download或upload ...
- Ajax的工作原理
Ajax的核心是JavaScript对象XmlHttpRequest.该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpRequest使您可 ...
- Android进阶笔记17:3种JSON解析工具(org.json、fastjson、gson)
一. 目前解析json有三种工具:org.json(Java常用的解析),fastjson(阿里巴巴工程师开发的),Gson(Google官网出的),其中解析速度最快的是Gson. 3种json工具下 ...
- emWin使用外部SRAM的方法
我用的是stm32,加了1MB的外部SRAM,在使用emWin的时候,将一部分内存分配给emWin使用.其实方法很简单,传入SRAM数据总线地址即可,数据位宽我采用16bit,因为使用的SRAM是16 ...
- 怒刷DP之 HDU 1069
Monkey and Banana Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u S ...
- C#基础回顾以及if语句
一.输入和输出Console.Write("字符串")Console.WriteLine("字符串")string s = Console.ReadLine() ...
- 编译项目报错: Ignoring file / xxx , missing required architecture i386 in file / xxx (2 slices)
.lib 或者 .a需用于真机版本,也就是ARM7的,如果你编译的是模拟器就会出现这个错误: 选择真机调试即可 .