列表

详情


NC216. 逆波兰表达式求值

描述

给定一个逆波兰表达式,求表达式的值。

数据范围:表达式长度满足 ,表达式中仅包含数字和 + ,- , * , / ,其中数字的大小满足

示例1

输入:

["2","1","+","4","*"]

输出:

12

示例2

输入:

["2","0","+"]

输出:

2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 3ms, 内存消耗: 668KB, 提交时间: 2022-02-08

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param tokens string字符串一维数组 
 * @param tokensLen int tokens数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int evalRPN(char** tokens, int tokensLen ) {
    // write code here
    
    int stack[tokensLen];
    int top = -1;
    int i = 0;
    int num1,num2;
    
    //若是运算符,运算
    for(i=0;i<tokensLen;i++){
        
    
    
    if((tokens[i][0]=='+' || tokens[i][0]=='-' || tokens[i][0]=='*' || tokens[i][0]=='/') && strlen(tokens[i])==1){
        switch(tokens[i][0]){
            case '+':
                num1 = stack[top--];
                num2 = stack[top--];
                stack[++top] = num2+num1;
                break;
            
            case '-':
                num1 = stack[top--];
                num2 = stack[top--];
                stack[++top] = num2-num1;
                break;
                
            case '*':
                num1 = stack[top--];
                num2 = stack[top--];
                stack[++top] = num2*num1;
                break;
                
            case '/':
                num1 = stack[top--];
                num2 = stack[top--];
                stack[++top] = num2/num1;
                break;
        }
    }
    
    
    //若是数字,直接入栈
    else{
        stack[++top] = atoi(tokens[i]);
    }
    
    }
    return stack[top];
    
    
}

C 解法, 执行用时: 4ms, 内存消耗: 640KB, 提交时间: 2022-07-31

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param tokens string字符串一维数组 
 * @param tokensLen int tokens数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int evalRPN(char** tokens, int tokensLen ) {
    // write code here
    int stack[tokensLen];
    int num1=0,num2=0,top=0;
    for(int i=0;i<tokensLen;i++)
    {
        if((*tokens[i]=='+'||*tokens[i]=='-'||*tokens[i]=='*'||*tokens[i]=='/') && strlen(tokens[i])==1)
        {
            switch (*tokens[i])
            {
            case '+':
                num1=stack[top--];
                num2=stack[top--];
                stack[++top]=num2+num1;
                break;
            case '-':
                num1=stack[top--];
                num2=stack[top--];
                stack[++top]=num2-num1;
                break;
                 
            case '*':
                num1=stack[top--];
                num2=stack[top--];
                stack[++top]=num2*num1;
                break;
            case '/':
                num1=stack[top--];
                num2=stack[top--];
                stack[++top]=num2/num1;
                break;
            }       
        }
        else
            stack[++top]=atoi(tokens[i]);
    }
    return stack[top];
}

C 解法, 执行用时: 4ms, 内存消耗: 640KB, 提交时间: 2022-07-20

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param tokens string字符串一维数组 
 * @param tokensLen int tokens数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
typedef struct stack{
    int *val;
    int top;
    int capacity;
}ST;
void StackInit(ST *ps)
{
    ps->capacity = 0;
    ps->top = 0;
    ps->val = NULL;
}
void StackPush(ST *ps,int value)
{
    if(ps->top == ps->capacity)
    {
        int newcapacity = ps->capacity==0?4:ps->capacity*2;
        int* tmp = realloc(ps->val,sizeof(int)*newcapacity);
        
        ps->capacity = newcapacity;
        ps->val = tmp;
    }
    ps->val[ps->top] = value;
    ps->top++;
}
int StackPop(ST *ps)
{
    if(ps->top == 0)
    {
        return 0;
    }
    else
    {
        ps->top--;
        return ps->val[ps->top];
    }
}
int StackTop(ST *ps)
{
    if(ps->top == 0)
    {
        return 0;
    }
    else
    {
        return ps->val[ps->top-1];
    }
}
//char* itoa(int value,char*string,int radix);
//int atoi(const char *str) 
int evalRPN(char** tokens, int tokensLen ) {
    // write code here
    ST stack;
    StackInit(&stack);
    char **cur = tokens;
    int tmp1,tmp2,tmp;
    char * tmp_str;
    int i = 0;
    while(i < tokensLen)
    {
        if((*cur[i]=='+'||*cur[i]=='-'||*cur[i]=='/'||*cur[i]=='*') && *(cur[i]+1) == 0)
        {
            tmp1 = StackPop(&stack);
            tmp2 = StackPop(&stack);
            if(*cur[i] == '+')
                tmp = tmp2 + tmp1;
            else if(*cur[i] == '-')
                tmp = tmp2 - tmp1;
            else if (*cur[i] == '*')
                tmp = tmp2 * tmp1;
            else
                tmp = tmp2 / tmp1;
            StackPush(&stack, tmp);
        }
        else
        {
            tmp = atoi(cur[i]);
            StackPush(&stack, tmp);
        }
        i++;
    }
    return StackPop(&stack);
}













C 解法, 执行用时: 4ms, 内存消耗: 640KB, 提交时间: 2022-04-04

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param tokens string字符串一维数组 
 * @param tokensLen int tokens数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int evalRPN(char** tokens, int tokensLen ) {
    // write code here
    int val1,val2;
    int Stack[10000];
    int top=-1;
    
    for(int i=0; i<tokensLen; i++) {
        if(tokens[i][0] =='+' && tokens[i][1] == '\0') {
            val2 = Stack[top--];
            val1 = Stack[top--];
            Stack[++top] = val1 + val2;
        }
        else if(tokens[i][0] =='-' && tokens[i][1] == '\0') {
            val2 = Stack[top--];
            val1 = Stack[top--];
            Stack[++top] = val1 - val2;           
        }
        else if(tokens[i][0] =='*' && tokens[i][1] == '\0') {
            val2 = Stack[top--];
            val1 = Stack[top--];
            Stack[++top] = val1 * val2;            
        }
        else if(tokens[i][0] =='/' && tokens[i][1] == '\0') {
            val2 = Stack[top--];
            val1 = Stack[top--];
            Stack[++top] = val1 / val2;             
        }
        else Stack[++top] = atoi(tokens[i]);
    }
    return (int)Stack[top];
}

C 解法, 执行用时: 4ms, 内存消耗: 648KB, 提交时间: 2022-05-19

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param tokens string字符串一维数组 
 * @param tokensLen int tokens数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
#define SIZE 10000

typedef struct{
    int a[SIZE];
    int top;
}Stack;

void push(Stack *s, int num)
{
    if(s->top>=SIZE)
        return;
    else
    {
        s->top++;
        s->a[s->top] = num;
    }
}

int pop(Stack *s)
{
    s->top--;
    return s->a[s->top + 1];
}


int evalRPN(char** tokens, int tokensLen ) {
    // write code here
    char str[10] = {0};
    int num1, num2;
    
    Stack *stack = (Stack *)malloc(sizeof(Stack));
    
    stack->top=-1;
    for(int i=0; i<tokensLen; i++)
    {
        strcpy(str, *tokens);
        if(strcmp(str, "+") == 0)//加法运算
        {
            num2 = pop(stack);
            num1 = pop(stack);
            push(stack, num1+num2);
        }
        else if(strcmp(str, "-") == 0)
        {
            num2 = pop(stack);
            num1 = pop(stack);
            push(stack, num1-num2);
        }
        else if(strcmp(str, "*") == 0)
        {
            num2 = pop(stack);
            num1 = pop(stack);
            push(stack, num1*num2);
        }
        else if(strcmp(str, "/") == 0)
        {
            num2 = pop(stack);
            num1 = pop(stack);
            push(stack, num1/num2);
        }
        else
        {
            num1 = atoi(str);
            push(stack, num1);
        }
        tokens++;
    }
    
    return pop(stack);
    
}

上一题