zoukankan      html  css  js  c++  java
  • 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=0;i<MAXSIZE;i++){
            s->data[i]='';
        }
        s->top=-1;
        return 1;
    }
    
    //入栈
    Status push(SqStock *s,SElemType e){
        if(s->top==MAXSIZE-1){ //已达最大容量
            return 0;
        };
        s->top++;
        s->data[s->top]=e;
        return 1;
    
    }
    
    
    //出栈
    Status pop(SqStock *s,SElemType *e){
        if(s->top==-1){//已到栈底
            return 0;
        }
        *e=s->data[s->top--];
        return 1;
    }
    
    //转化为8进制
    void Conversion(){
        int N;
        SqStock *s;
        s=(SqStock *)malloc( sizeof( SqStock)); //申请内存空间
        InitStock(s);
        printf("请输入一个十进制整数:");
        scanf("%d",&N);
        while(N){
    
            push(s,N%8);
            N=N/8;
        }
        int e;
        while(s->top!=-1){
            pop(s,&e);
            printf("%d",e);
        }
    }
    /************函数区*******/

    上述代码思路:利用数组来实现栈的功能,平时用的时候完全直接使用数组和一个int型的top,其值为当前栈顶元素所在的下标。至于如何处理栈溢出的问题,要么将容量设置大一点,要么在快要溢出的时候动态申请一些内存空间。当然,肯定还有其他的方法,自己要有探索精神哦。

    接着是队列的一些基本功能的算法:

      1 #include <stdio.h>
      2 #include <tchar.h>
      3 #include<stdlib.h>
      4 #include<math.h>
      5 #include<time.h>
      6 
      7 
      8 #define MAXSIZE 20
      9 
     10 typedef int QElemType;
     11 typedef int Status;
     12 //使用循环队列
     13 typedef struct {
     14 
     15     QElemType Data[MAXSIZE]; 
     16     int front;
     17     int rear;
     18 }XHQueue;
     19 
     20 int getRand(int ,int );//当时测试随机数的,两个变量是上下限
     21 void InitQueue(XHQueue *);  //初始化队列
     22 Status EnQueue(XHQueue *,QElemType ); //入队
     23 Status DeQueue(XHQueue *,QElemType *);//出队
     24 Status IsEmpty(XHQueue *); //判断是否为空
     25 
     26 /*****函数区***/
     27 //产生随机函数
     28 int getRand(int MinSize,int MMaxSize){
     29     time_t t;
     30     int r;
     31     srand((unsigned)time(&t));
     32     r=rand()%(MMaxSize-MinSize+1)+MinSize;
     33     return r;
     34 }
     35 
     36 
     37 //队列初始化
     38 void InitQueue(XHQueue *Q){
     39     Q->front=0;
     40     Q->rear=0;
     41 
     42 
     43 }
     44 
     45 //入队
     46 
     47 Status EnQueue(XHQueue *Q,QElemType E){
     48 
     49     if((Q->rear+1)%MAXSIZE ==Q->front)//队列已满
     50     {
     51         return 0;
     52     }
     53     Q->Data[Q->rear]=E;
     54     Q->rear=(Q->rear+1)%MAXSIZE;
     55     return 1;
     56 }
     57 
     58 //出队
     59 Status DeQueue(XHQueue *Q,QElemType *E){ //至于为什么是*E,去看看c的传值与传址,在使用的时候要写成DeQueue(Q ,&变量),传址符不能少
     60     if(Q->front==Q->rear){//队列已空
     61         return 0;
     62     }
     63     *E=Q->Data[Q->front];
     64     Q->front=(Q->front+1)%MAXSIZE;
     65 
     66     return 1;
     67 
     68 }
     69 
     70 //判断是否为空
     71 Status IsEmpty(XHQueue *Q){
     72     if(Q->front==Q->rear){
     73         return 1;
     74     }
     75     return 0;
     76 
     77 }
     78 /*****函数区***/
     79 
     80 int _tmain(int argc, _TCHAR* argv[])
     81 {
     82     /*int r,r1;
     83     r=getRand(20,35);
     84     r1=getRand(20,40);
     85     printf("%d %d
    ",r,r1);*/
     86 
     87     int Re;
     88     XHQueue *Q;
     89     Q=(XHQueue *)malloc(sizeof(XHQueue));
     90      InitQueue(Q);  
     91      EnQueue(Q,2);
     92      EnQueue(Q,0);
     93      EnQueue(Q,1);
     94      EnQueue(Q,5);
     95      while(!IsEmpty(Q)){
     96          DeQueue(Q,&Re);
     97          printf("%d",Re);
     98      }
     99      
    100     system("pause");
    101     return 0;
    102 }

          代码说明:原谅我比较懒。。好多都原封不动的贴上来了= =!从思路上来说,现实生活中的队列都是走一个,所有人往前移,但在程序中也写成这样,也不是不可以,但在队列比较长的时候,光移动这些元素就会花费大量的时间,是非常不划算的,所以,为了避免这样大规模的移动,使用循环队列的思想,即队头走了就走了,我们把队头指针往后移一个,队尾来人了,发现已经站不了了,那就去前面看看,前面说不定就能站呢。

         恩暂时就贴这么多啦~改天有空再贴些其他的~

  • 相关阅读:
    Tornado session 插件 pycket 定制时间和时间续租
    为Tornado框架加上基于Redis或Memcached的session 【第三方】
    正则表达式大全 --【Python举例】
    Django 最好的缓存memcached的使用 小记
    Django 1.9 admin 使用suit 小记
    IntelliJ IDEA 注册码
    Python 爬虫抓取代理IP,并检测联通性
    MySQL自定义函数
    css补充知识
    sqlalchemy 知识补充
  • 原文地址:https://www.cnblogs.com/ForRickHuan/p/5176352.html
Copyright © 2011-2022 走看看