计蒜课数据结构栈的复习

Posted p201821430045

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜课数据结构栈的复习相关的知识,希望对你有一定的参考价值。

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

 

#define ERROR 0

#define OK 1

 

typedef struct Stack {

    int *elements;

    int max_size, top_index;

} Stack;

 

void init(Stack *s,int length) {

    s->elements = (int *)malloc(sizeof(int) * length);

    s->max_size = length;

    s->top_index = -1;

}

 

int push(Stack *s,int element) {

    if (s->top_index >= s->max_size - 1) {

        return ERROR;

    }

    s->top_index++;

    s->elements[s->top_index] = element;

    return OK;    

}

 

int pop(Stack *s) {

    if (s->top_index < 0) {

        return ERROR;

    }

    s->top_index--;

    return OK;

}

 

int top(Stack *s) {

    return s->elements[s->top_index];  

}

 

int empty(Stack *s) {

    if (s->top_index < 0) {

        return 1;

    } else {

        return 0;

    }   

}

 

int precede(char a,char b) {

    if(a==‘*‘ || a==‘/‘){

        if(b==‘*‘ || b==‘/‘)

            return 0;

        else

            return 1;

        

    }

    else

        return 0;

}

int operate(char theta,int a,int b) {

    if (theta == ‘+‘) {

        return a + b;

    }

    if(theta == ‘-‘){

        return b - a;

    }

    if(theta == ‘/‘){

        return b / a;

    }

    else {

        return a * b;

    }

}

 

void calc(Stack *numbers, Stack *operators) {

    int a=top(numbers);

    pop(numbers);

    int b=top(numbers);

    pop(numbers);

    push(numbers,operate(top(operators),a,b));

    pop(operators);  

}

 

void clear(Stack *s) {

    free(s->elements);

    free(s);   

}

 

int main() {

    int m;

    scanf("%d",&m);

    Stack *numbers=(Stack*)malloc(sizeof(Stack));

    init(numbers,m);

    Stack *operators=(Stack*)malloc(sizeof(Stack));

    init(operators,m);

    char *buffer=(char*)malloc(sizeof(char)*(m+1));

    scanf("%s",buffer);

    int i=0;

    while(i<m){

        if(isdigit(buffer[i])){

            push(numbers,buffer[i]-‘0‘);

            i++;

        }else{

            if(empty(operators) || precede(buffer[i],top(operators))){

                push(operators,buffer[i]);

                i++;

            }

            else{

                calc(numbers,operators);

            }

        }

    }

    while(!empty(operators)){

        calc(numbers,operators);

    }

    printf("%d ",top(numbers));

    clear(numbers);

    clear(operators);

    free(buffer);

    return 0;

}

以上是关于计蒜课数据结构栈的复习的主要内容,如果未能解决你的问题,请参考以下文章

计蒜课_二分法求平方根

计蒜课 16957 拓扑排序

计蒜课_加一

计蒜课/百度的年会游戏(枚举)

计蒜课/UCloud 的安全秘钥(hash)

计蒜课/ 微软大楼设计方案/中等(xjb)