用栈实现计算器

class Stack:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

def infixToPostfix(infixexpr):
    '''
    中缀转后缀
    :param infixexpr:
    :return:
    '''
    prec = {}
    prec['*'] = 3
    prec['/'] = 3
    prec['+'] = 2
    prec['-'] = 2
    prec['('] = 1
    opStack = Stack()
    postfixList = []
    # tokenList = infixexpr.split()
    # print(tokenList)
    for token in infixexpr:
        if token in '0123456789':
            postfixList.append(token)
        elif token == '(':
            opStack.push(token)
        elif token == ')':
            topToken = opStack.pop()
            while topToken != '(':
                postfixList.append(topToken)
                topToken = opStack.pop()
        else:
            while (not opStack.isEmpty()) and \
                    (prec[opStack.peek()] >= prec[token]):
                print(opStack)
                postfixList.append(opStack.pop())
            opStack.push(token)

    while not opStack.isEmpty():
        postfixList.append(opStack.pop())
    return ''.join(postfixList)



def postfixEval(postfixExpr):
    operandStack = Stack()
    # tokenList = postfixExpr.split()

    for token in postfixExpr:
        if token in '0123456789':
            operandStack.push(int(token))
        else:
            operand2 = operandStack.pop()
            operand1 = operandStack.pop()
            result = doMath(token, operand1, operand2)
            operandStack.push(result)
    return operandStack.pop()

def doMath(op, op1, op2):
    if op == '*':
        return op1 * op2
    elif op == '/':
        return op1 / op2
    elif op == '+':
        return op1 + op2
    else:
        return op1 - op2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,使用栈(Stack)实现计算器的主要目的是演示递归调用和表达式求值的基本算法,特别是后缀表达式(也称为逆波兰表示法,RPN)。这种方法不需要复杂的符号表或优先级规则,非常适合教学和理解递归。 以下是一个简单的栈实现后缀表达式计算器的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义数据结构 typedef struct { double num; } Number; typedef struct { char operator; Number left, right; } Expression; // 函数声明 void push(Number stack[], int &top); double pop(Number stack[], int &top); char pop_operator(Number stack[], int &top); // 后缀表达式处理函数 double evaluate_postfix(char* exp); int main() { char expression[100]; printf("Enter an expression in postfix notation: "); fgets(expression, sizeof(expression), stdin); expression[strcspn(expression, "\n")] = '\0'; // 去除末尾的换行符 double result = evaluate_postfix(expression); printf("Result: %.2lf\n", result); return 0; } // 栈操作 void push(Number stack[], int &top) { Number n = {atof(stack[top].num)}; top++; stack[top] = n; } double pop(Number stack[], int &top) { top--; return stack[top].num; } char pop_operator(Number stack[], int &top) { top--; return stack[top].operator; } // 表达式求值 double evaluate_postfix(char* exp) { int top = 0; Number stack[100]; // 栈大小可调整 stack = {'0'}; // 初始化栈顶为0 for (int i = 0; exp[i] != '\0'; i++) { if (isdigit(exp[i])) { push(stack, top); // 如果是数字,压入栈 } else { double right = pop(stack, top); double left = pop(stack, top); switch (exp[i]) { case '+': stack[top++] = {left + right}; break; case '- right}; break; case '*': stack[top++] = {left * right}; break; case '/': stack[top++] = {left / right}; break; // 添加其他运算符处理 } } } return pop(stack, top); // 返回结果 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值