使用栈实现表达式求值(栈实现计算器),不含语法检测

/*
这是一个算术表达式求值得源代码
算符间的优先关系:
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
运算符1\运算符2|    +   |   -   |   *   |   /   |   (   |   )   |    #/=    |
    +         |    >   |   >   |   <   |   <   |   <   |   >   |    >      |
    -         |    >   |   >   |   <   |   <   |   <   |   >   |    >      |
    *         |    >   |   >   |   >   |   >   |   <   |   >   |    >      |
    /         |    >   |   >   |   >   |   >   |   <   |   >   |    >      |
    (         |    <   |   <   |   <   |   <   |   <   |   =   |           |                                                                                                                                                                                                                                                                                 
    )         |    >   |   >   |   >   |   >   |       |   >   |    >      |
    #/=       |    <   |   <   |   <   |   <   |   <   |       |    =      |  
*/
#include"stack"
using namespace std;
char OP[7] = {'+', '-', '*', '/', '(', ')', '#'};
char PMATRIX[7][7] = {
//  {'+', '-', '*', '/', '(', ')', '#'};
    {'>', '>', '<', '<', '<', '>', '>'},
    {'>', '>', '<', '<', '<', '>', '>'},
    {'>', '>', '>', '>', '<', '>', '>'},
    {'>', '>', '>', '>', '<', '>', '>'},
    {'<', '<', '<', '<', '<', '=', ' '},
    {'>', '>', '>', '>', ' ', '>', '>'},
    {'<', '<', '<', '<', '<', ' ', '='}
};

BOOL In(char c, char OP[]){
    for (int i = 0; i < 7; ++i){
        if (c == OP[i]){
            return True;
        }
    }
    return False;
}

char Precede(ElementType_c topelement, char c){
    int i = 0, j = 0;
    for (i = 0; i < 7; ++i){
        if (topelement == OP[i]){
            break;
        }
    }
    for (j = 0; j < 7; ++j){
        if (c == OP[j]){
            break;
        }
    }
    return PMATRIX[i][j];
}

ElementType_f Operate(ElementType_f opnd_1, ElementType_c theta, ElementType_f opnd_2){
    switch (theta){
        case '+':
            return opnd_1 + opnd_2;
            break;
        case '-':
            return opnd_1 - opnd_2;
            break;
        case '*':
            return opnd_1 * opnd_2;
            break;
        case '/':
            return opnd_1 / opnd_2;
            break;        
        default:
            break;
    }
    return 0;
}

ElementType_f sTof(char *c){
    char str[11] = {};  // 最大十位数字
    int i = 1;
    str[0] = *c;
    while(In(*c = getchar(), OP) == False){
        str[i] = *c;
        ++i; 
    }
    str[i] = '\0';
    return atof(str);
}
int main(){
    Stack_c *OPTR = NULL;
    Stack_f *OPND = NULL;  // OPTR运算符栈,OPND运算数栈
    InitStack(&OPTR);
    InitStack(&OPND);
    Push(OPTR, '#');
    char c;
    printf("please input expression:\n");
    c = getchar();
    ElementType_c topelement = {}, popelement = {};
    ElementType_c theta = {};
    ElementType_f opnd_1 = 0, opnd_2 = 0, result = 0;
    GetTop(OPTR, &topelement);
    while (c != '#' || topelement != '#'){
        if (In(c, OP) == False){
            Push(OPND, sTof(&c));
            GetTop(OPTR, &topelement);
            continue;
        }
        else{
            switch (Precede(topelement, c)){
                case '<':  //栈顶元素优先权小于c
                    Push(OPTR, c);
                    c = getchar();
                    GetTop(OPTR, &topelement);
                    break;
                case '=':
                    Pop(OPTR, &popelement);
                    c = getchar();
                    GetTop(OPTR, &topelement);
                    break;
                case '>':
                    Pop(OPTR, &theta);
                    Pop(OPND, &opnd_2);
                    Pop(OPND, &opnd_1);
                    result = Operate(opnd_1, theta, opnd_2);
                    Push(OPND, result);
                    GetTop(OPTR, &topelement);
                    break;
            GetTop(OPTR, &topelement);
            }
        }
    }
    Pop(OPND, &result);
    printf("%f", result);
    return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElementType_c;
typedef double ElementType_f;
typedef enum{True = 0, False = 1} BOOL;

#define DEFAULT_STACKSIZE 100
#define STACKSIZE_INCREMENT 20
typedef struct Stack_c{
    ElementType_c *stack;      // 栈底指针
    ElementType_c *topelement; // 栈顶指针
    int stackSize;
} Stack_c;

typedef struct Stack_f{
    ElementType_f *stack;      // 栈底指针
    ElementType_f *topelement; // 栈顶指针
    int stackSize;
} Stack_f;

BOOL InitStack(Stack_c** stack){
    *stack = (Stack_c *)malloc(sizeof(Stack_c));
    if (stack == NULL){
        return False;
    }
    else{
        (*stack)->stackSize = DEFAULT_STACKSIZE; // 栈的大小为DEFAULT_STACKSIZE
        // 将栈的空间stack分配好
        ElementType_c *stack_;
        stack_ = (ElementType_c *)malloc(sizeof(ElementType_c) * ((*stack)->stackSize));
        if (stack_ == NULL){
            return False;
        }
        else{
            memset(stack_, 0, sizeof(stack_));
            (*stack)->stack = stack_;
            (*stack)->topelement = stack_;
            // *(*stack)->topelement = '\0';  // 将栈转为字符串
            return True;
        }
    }
} // 操作结果:构造一个空栈stack
BOOL InitStack(Stack_f** stack){
    *stack = (Stack_f *)malloc(sizeof(Stack_f));
    if (stack == NULL){
        return False;
    }
    else{
        (*stack)->stackSize = DEFAULT_STACKSIZE; // 栈的大小为DEFAULT_STACKSIZE
        // 将栈的空间stack分配好
        ElementType_f *stack_;
        stack_ = (ElementType_f *)malloc(sizeof(ElementType_f) * ((*stack)->stackSize));
        if (stack_ == NULL){
            return False;
        }
        else{
            memset(stack_, 0, sizeof(stack_));
            (*stack)->stack = stack_;
            (*stack)->topelement = stack_;
            // *(*stack)->topelement = '\0';  // 将栈转为字符串
            return True;
        }
    }
} // 操作结果:构造一个空栈stack
// 初始条件:栈S已存在
BOOL DestroyStack(Stack_c *stack){
    if (stack == NULL){
        return False;
    }
    else{
        free(stack->stack);
        stack->stack = NULL;
        free(stack);
        stack = NULL;
        return True;
    }
} // 操作结果:栈stack被销毁

BOOL DestroyStack(Stack_f *stack){
    if (stack == NULL){
        return False;
    }
    else{
        free(stack->stack);
        stack->stack = NULL;
        free(stack);
        stack = NULL;
        return True;
    }
} // 操作结果:栈stack被销毁

// 初始条件:栈S已存在
BOOL StackEmpty(Stack_c *stack){
    if (stack == NULL){
        return False;
    }
    else{
        if (stack->topelement == stack->stack){
            return True;
        }
        else{
            return False;
        }
    }
} // 操作结果:若栈为空则返回True,否则返回False

BOOL StackEmpty(Stack_f *stack){
    if (stack == NULL){
        return False;
    }
    else{
        if (stack->topelement == stack->stack){
            return True;
        }
        else{
            return False;
        }
    }
} // 操作结果:若栈为空则返回True,否则返回False
// 初始条件:栈S已存在
int StackLength(Stack_c *stack){
    if (stack == NULL){
        return -1;
    }
    else{
        if (StackEmpty(stack) == True){
            return 0;
        }
        else{
            return (int)(stack->topelement - stack->stack);
        }
    }
} // 操作结果:返回S的元素个数,即栈的长度。

int StackLength(Stack_f *stack){
    if (stack == NULL){
        return -1;
    }
    else{
        if (StackEmpty(stack) == True){
            return 0;
        }
        else{
            return (int)(stack->topelement - stack->stack);
        }
    }
} // 操作结果:返回S的元素个数,即栈的长度。

// 初始条件:栈S已存在且非空
BOOL GetTop(Stack_c *stack, ElementType_c *topelement){
    if (stack == NULL){  // 不可能出现的情况 &后接NULL
        return False;
    }
    else{
        if (StackEmpty(stack) == True){
            topelement = NULL;
            return False;
        }
        else{
            ElementType_c *p = stack->topelement - 1;
            *topelement = *p;
            return True;
        }
    }
} // 操作结果:用topelement返回S的栈顶元素

BOOL GetTop(Stack_f *stack, ElementType_f *topelement){
    if (stack == NULL){  // 不可能出现的情况 &后接NULL
        return False;
    }
    else{
        if (StackEmpty(stack) == True){
            topelement = NULL;
            return False;
        }
        else{
            *topelement = *(stack->topelement - 1);
            return True;
        }
    }
} // 操作结果:用topelement返回S的栈顶元素

// 初始条件:栈S已存在
BOOL Push(Stack_c *stack, ElementType_c pushelement){
    if (stack == NULL){
        return False;
    }
    else{
        if (StackLength(stack) >= stack->stackSize){
            stack->stack = (ElementType_c *)realloc(stack->stack, (stack->stackSize + STACKSIZE_INCREMENT) * sizeof(ElementType_c));
            if (stack->stack == NULL){
                return False;
            }
            else{
                stack->stackSize += STACKSIZE_INCREMENT;
            }
        }
        *(stack->topelement) = pushelement;  // 两句合并成一句 *stack->toplement++ =  pushelement
        ++(stack->topelement) ;
        return True;
    }
} // 操作结果:插入元素pushelement为新的栈顶元素

BOOL Push(Stack_f *stack, ElementType_f pushelement){
    if (stack == NULL){
        return False;
    }
    else{
        if (StackLength(stack) >= stack->stackSize){
            stack->stack = (ElementType_f *)realloc(stack->stack, (stack->stackSize + STACKSIZE_INCREMENT) * sizeof(ElementType_f));
            if (stack->stack == NULL){
                return False;
            }
            else{
                stack->stackSize += STACKSIZE_INCREMENT;
            }
        }
        *(stack->topelement) = pushelement;  // 两句合并成一句 *stack->toplement++ =  pushelement
        ++(stack->topelement);
        return True;
    }
} // 操作结果:插入元素pushelement为新的栈顶元素
// 初始条件:栈S已存在且非空
BOOL Pop(Stack_c *stack, ElementType_c *popelement){
    if (stack == NULL){
        return False;
    }
    else{
        if (StackLength(stack) == 0){
            return False;
        }
        else{
            *popelement = *(--(stack->topelement));
            return True;
        }
    }
} // 操作结果:删除S的栈顶元素,并用e返回其值
BOOL Pop(Stack_f *stack, ElementType_f *popelement){
    if (stack == NULL){
        return False;
    }
    else{
        if (StackLength(stack) == 0){
            return False;
        }
        else{
            *popelement = *(--(stack->topelement));
            return True;
        }
    }
} // 操作结果:删除S的栈顶元素,并用e返回其值

运行结果:
在这里插入图片描述

实现两种数据类型的栈我使用的是函数重载,各位老大哥有什么好的意见多在评论区分享,感激不尽。
参考:《数据结构(C语言版)》清华大学出版社,页44-54。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值