首页 > 编程知识 正文

简单计算器手机版,c语言中如何完成一个简单计算器

时间:2023-05-04 00:55:05 阅读:259445 作者:1431

**1. 中缀转后缀表示

变化过程使用运算栈g_operStack 最后的结果保存在数据队列g_dataStack ,便于后面计算

为了区分运算符和数字,对所有运算符加了偏移, 所有数据为非负

操作数直接输出运算符压栈:从运算栈中依次大于等于其优先级的 运算符,一直遇到小于其优先级的运算符或者左括号为止左括号直接压栈,右括号,从运算栈中依次弹出运算符,一直到有一个左括号弹出为止最后栈中所有操作符依次弹出两个数,作为第二操作数和第一操作数

**2. 求后缀

数据队列

数字一直压栈,支到遇到符号弹出两个数据,作为第二操作数和第一操作数,计算结果再压栈 #include <stdio.h>#include <string.h>enum { ZERO = 0, ONE, TEN = 10, ZEROCH = '0', ONECH = '1', NINECH = '9', PLUS = '+', MINUS = '-', MULTI = '*', DEVIDE = '/', SMALLLEFT = '(', SMALLRIGHT = ')', ENDCH = '', MAXLENGTH = 1000001,};int ADJ = -100;typedef struct TagStack { int cnt; int data[MAXLENGTH];} Stack;Stack g_dataStack = { 0, {0}};Stack g_operStack = { 0, {0}};void DealOPer(int ch){ if (ch == SMALLLEFT) { /* g_operStack 用来存中间运算符 */ g_operStack.data[g_operStack.cnt++] = ch; } else if (ch == SMALLRIGHT) { while (g_operStack.cnt > ZERO && g_operStack.data[g_operStack.cnt - ONE] != SMALLLEFT) { g_dataStack.data[g_dataStack.cnt++] = g_operStack.data[--g_operStack.cnt] + ADJ; } --g_operStack.cnt; } else if (ch == PLUS || ch == MINUS) { while (g_operStack.cnt > ZERO && g_operStack.data[g_operStack.cnt - ONE] != SMALLLEFT) { g_dataStack.data[g_dataStack.cnt++] = g_operStack.data[--g_operStack.cnt] + ADJ; } g_operStack.data[g_operStack.cnt++] = ch; } else if (ch == MULTI || ch == DEVIDE) { while (g_operStack.cnt > ZERO && (g_operStack.data[g_operStack.cnt - ONE] == MULTI || g_operStack.data[g_operStack.cnt - ONE] == DEVIDE)) { g_dataStack.data[g_dataStack.cnt++] = g_operStack.data[--g_operStack.cnt] + ADJ; } g_operStack.data[g_operStack.cnt++] = ch; }}void PostGen(char *s){ int len = strlen(s); char ch; int dataFlag = ZERO; int num = 0; for (int i = 0; i < len; ++i) { ch = s[i]; if (ZEROCH <= ch && ch <= NINECH) { num *= TEN; num += ch - ZEROCH; dataFlag = ONE; } else { if (dataFlag) { g_dataStack.data[g_dataStack.cnt++] = num; num = 0; dataFlag = ZERO; } DealOPer(ch); } } if (dataFlag) { g_dataStack.data[g_dataStack.cnt++] = num; } while (g_operStack.cnt > ZERO) { g_dataStack.data[g_dataStack.cnt++] = g_operStack.data[--g_operStack.cnt] + ADJ; }}int GetResult(int data2, int data1, int oper){ if (oper == PLUS) { return data2 + data1; } else if (oper == MINUS) { return data2 - data1; } else if (oper == MULTI) { return data2 * data1; } else { return data2 / data1; }}int CalcProc(){ int data1, data2, res; for (int i = 0; i < g_dataStack.cnt; ++i) { if (g_dataStack.data[i] < ZERO) { data1 = g_operStack.data[--g_operStack.cnt]; data2 = g_operStack.data[--g_operStack.cnt]; res = GetResult(data2, data1, g_dataStack.data[i] - ADJ); g_operStack.data[g_operStack.cnt++] = res; /* g_operStack 用来存中间数字 */ } else { g_operStack.data[g_operStack.cnt++] = g_dataStack.data[i]; } } if (g_operStack.cnt == ONE) { return g_operStack.data[ZERO]; } else { return 0; }}int calculate(char *s){ g_dataStack.cnt = 0; g_operStack.cnt = 0; PostGen(s); return CalcProc();}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。