堆栈实现一个整型计算器

mac2022-06-30  99

计算器特性: 支持整型运算(±*/%),能够处理运算符和操作数间的空格,支持括号

实现思路: 利用一个操作数堆栈dgt和一个运算符堆栈ops实现; 1、从左至右扫描运算表达式输入,若为操作数则直接压入dgt堆栈 2、若为运算符则判断ops中是否已经存在运算符,不存在则直接压入,存在则与栈顶运算符比较优先级,优先级高则直接压入,否则就持续pop(每次pop就是取出dgt最顶上两个数和ops栈顶的运算符作一次运算后将结果重新压回dgt),直到找到一个优先级比当前运算符c低的或者堆栈空了。 3、最后到句末\n时再把之前没有pop的运算全部pop掉,最终表达式的结果就是dgt[0]的值

#include<stdio.h> char ops[100]; int o_top = -1; int dgt[100]; int d_top = -1; void pop() { switch (ops[o_top]) { case '-': dgt[d_top - 1] -= dgt[d_top]; d_top--; o_top--; break; case '+': dgt[d_top - 1] += dgt[d_top]; d_top--; o_top--; break; case '*': dgt[d_top - 1] *= dgt[d_top]; d_top--; o_top--; break; case '/': dgt[d_top - 1] /= dgt[d_top]; d_top--; o_top--; break; case '%': dgt[d_top - 1] %= dgt[d_top]; d_top--; o_top--; break; default: break; } } int prio(char c) { switch (c) { case '-': case '+': return 1; case '*': case '/': case '%': return 2; default: return 0; } } int main() { int m = 0; int m_set = 0; char c; // Testcase: 3 * 5 / 4 + (7) * ((29) * 6 / (4 - 1 + 7 * 8 / 5 * 6 * 2 + 5 + 7 - 4)) // Testcase: 2+3-4*1+5%2 while (c = getchar()) { if (c == ' ' || c == '\t') continue; if (c >= '0' && c <= '9') { m = m * 10 + c - '0'; m_set = 1; } else { // 如果之前读了一个操作数,则入栈 if (m_set) { dgt[++d_top] = m; m_set = 0; m = 0; } if (c == '(') { ops[++o_top] = c; } else if (c == ')') { while (ops[o_top] != '(') pop(); if (ops[o_top] == '(') o_top--; } else { if ('\n' == c) break; if (o_top < 0) { ops[++o_top] = c; continue; } // 是运算符且优先级不高于前一个运算符 // if (ops[o_top] != '(' && prio(c) <= prio(ops[o_top])) while (o_top >= 0 && ops[o_top] != '(' && prio(c) <= prio(ops[o_top])) pop(); ops[++o_top] = c; } } } while (o_top >= 0) pop(); printf("%d\n", dgt[0]); getchar(); } 测试用例: // Testcase: 3 * 5 / 4 + (7) * ((29) * 6 / (4 - 1 + 7 * 8 / 5 * 6 * 2 + 5 + 7 - 4)) --> 10 // Testcase: 2+3-4*1+5%2 --> 2
最新回复(0)