zoukankan      html  css  js  c++  java
  • C实现栈与队列

    C实现栈与队列

    做了个栈和队列的基础demo,写得比较快,就没有什么注释,其实看各个函数的名字就可以知道函数的作用了。

    栈的实现

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct stack{
        int *nums;
        int top;
        int size;
    }*stack;
    
    void changeSize(stack s,int size){
        int *p = (int *)realloc(s->nums,size*sizeof(int));
        s->nums = p;
        s->size = size;
        printf("Size has changed
    ");
    }
    
    void push(stack s, int x){
        if(s->top < s->size - 1){
            s->top ++;
        }else{
            printf("The stack is full
    ");
            changeSize(s,2*s->size);
        }
        s->nums[s->top] = x;
    }
    
    void pop(stack s){
        if(s->top < 0){
            printf("No enough data
    ");
            exit(0);
        }
        s->top--;
    }
    
    int peek(stack s){
        if(s->top < 0){
            printf("The stack is empty");
            return 0;
        }
        return s->nums[s->top];
    }
    
    _Bool isempty(stack s){
        if(s->top == -1){
            return 0;
        }else{
            return 1;
        }
    }
    
    void clearstack(stack s){
        free(s->nums);
        s->nums = NULL;
        s->top = -1;
        s->size = 0;
    }
    
    int main(){
        stack s = (stack)malloc(sizeof(struct stack));
        int size = 10;
        if(size < 1){
            printf("Error in size
    ");
            exit(0);
        }
        s->nums = (int *)malloc(sizeof(int)*size);
        s->top = -1;
        s->size = size;
    
        int a[12] = {3,2,1,4,6,5,8,7,0,9,6,4};
        for(int i = 0; i < 12; i++){
            push(s,a[i]);
            printf("The num on the top is %d
    ",peek(s));
        }
        pop(s);
        printf("The num on the top after pop  is %d
    ",peek(s));
        printf("The stack is %s
    ",isempty==0?"empty":"not empty");
        clearstack(s);
    }
    

    队列

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct queue{
        int *nums;
        int front,rear;
        int size;
    }*queue;
    
    void addSize(queue s,int size){
        int *p = (int *)realloc(s->nums,size*sizeof(int));
        if(s->rear > s->front){
            for(int i=0; i < s->front; i++){
                if(i+s->size < size){
                    p[i+s->size] = s->nums[i];
                }else{
                    p[(i+s->size)%size] = s->nums[i];
                }
            }
        }
        s->nums = p;
        s->size = size;
        printf("Size has changed
    ");
    }
    
    void push(queue s, int x){
        if((s->front+1)%(s->size) == s->rear){
            printf("The queue is full!
    ");
            addSize(s,2*(s->size));
        }else{
            s->nums[(s->front)%(s->size)] = x;
        }
        s->front ++;
    }
    
    void pop(queue s){
        if(s->rear == s->front){
            printf("The queue is empty
    ");
            exit(0);
        }
        s->rear ++;
        if(s->rear >= s->size){
            s->rear = (s->rear)%(s->size);
        }
    }
    
    int peekfront(queue s){
        if(s->front == s->rear){
            printf("The queue is empty
    ");
            return 0;
        }
        return s->nums[s->front-1];
    }
    
    int peekrear(queue s){
        if(s->front == s->rear){
            printf("The queue is empty
    ");
            return 0;
        }
        return s->nums[s->rear];
    }
    
    _Bool isempty(queue s){
        if(s->front == s->rear){
            return 0;
        }else{
            return 1;
        }
    }
    
    void clearqueue(queue s){
        free(s->nums);
        s->nums = NULL;
        s->front = 0;
        s->rear = 0;
        s->size = 0;
    }
    
    int main(){
        queue s = (queue)malloc(sizeof(struct queue));
        int size = 10;
        if(size < 1){
            printf("Error in size
    ");
            exit(0);
        }
        s->nums = (int *)malloc(sizeof(int)*size);
        s->front = 0;
        s->rear = 0;
        s->size = size;
    
        int a[12] = {3,2,1,4,5,7,6,9,8,0,8,9};
        for(int i = 0; i < 12; i++){
            push(s,a[i]);
            printf("The num on the front is %d
    ",peekfront(s));
        }
        pop(s);
        printf("The num on the top after push is %d
    ",peekfront(s));
        printf("The num on the rear after pop is %d
    ",peekrear(s));
        pop(s);
        printf("The num on the rear after pop is %d
    ",peekrear(s));
        printf("The queue is %s
    ",isempty==0?"empty":"not empty");
        clearqueue(s);
    }
    
  • 相关阅读:
    x01.os.17: 换心术
    x01.os.16: 添加功能
    x01.os.15: 看上去很美
    JVM 栈帧之操作数栈与局部变量表
    IDEA字节码学习查看神器jclasslib bytecode viewer介绍
    java上下文Context类
    UML ——区分类图中的几种关系.md
    UML ——六种依赖关系.md
    JDK动态代理[1]----代理模式实现方式的概要介绍
    java方法句柄-----5.Method Handles in Java
  • 原文地址:https://www.cnblogs.com/wangha/p/11099794.html
Copyright © 2011-2022 走看看