#include <iostream>
#include<String>
using namespace std;
//数组栈
int num_list[10];
int sys_list[10];
int num_top = -1;
int sys_top = -1;
int result=0;
int p1 = 0;
//数字入栈
void num_push(int num)
{
num_list[++num_top] = num;
}
//数字出栈
int num_pop()
{
int item = num_list[num_top];
num_list[num_top] = 0;
num_top--;
return item;
}
//符号入栈
void sys_push(int num)
{
sys_top++;
sys_list[sys_top] = num;
}
//符号出栈
int sys_pop()
{
int item = sys_list[sys_top];
sys_list[sys_top] = 0;
sys_top--;
return item;
}
//判断符号优先级, "(" > "*" = "/" > "+" = "-" > ")" > "="
//读取字符,压入栈中或者出栈
int read(char* p)
{
int item=0;
p = p + p1;
if (*p!= '\n')
{
if (*p == '+')
{
item = -7;
}
else if (*p == '-')
{
item = -6;
}
else if (*p == '*')
{
item = -5;
}
else if (*p == '/')
{
item = -4;
}
else if (*p == '(')
{
item = -3;
}
else if (*p == ')')
{
item = -8;
}
else if (*p == '=')
{
item = -9;
}
else if (*p >= 48 && *p <= 57)
{
item = *p-48;
}
}
return item;
}
//如何编写一个计算器程序呢?读取表达式,读到数字就存入a栈中,读到符号判断符号优先级是否存入栈中,如果当前读取的符号优先级大于栈中top优先级则直接存入栈中
//如果小于top优先级则从a栈中pop出两个元素与b栈中top符号进行计算,然后将当前符号存入b栈中。如果读取到(左括号,存入栈中并改为)右括号,使得括号内的数据能够被读取
//之后读取到右括号时pop出两个数字与符号top进行计算,并把之前的左括号(现在改为右括号)pop出b数组。
void main() {
cout << "请输入表达式:";
char str[30];
cin >> str;
bool flag = true;
while (flag)
{
int a = read(str);
p1++;
if (a >= 0)//a>=0,a是数字0-9
{
num_push(a);
}
else if ((a == -7 || a == -6) && a >sys_list[sys_top])//a为加号
{
sys_push(a);
}
else if ((a == -7 || a == -6) && a < sys_list[sys_top])//a为加号
{
if (sys_top == -1) {
sys_push(a);
}
else {
int a1 = num_pop();
int a2 = num_pop();
int s1 = sys_pop();
switch (s1) {
case -7:
result = a1 + a2;
break;
case -6:
result = a1 - a2;
break;
case -5:
result = a1 * a2;
break;
case -4:
result = a1 / a2;
break;
}
num_push(result);
sys_push(a);
}
}
else if ((a == -5 || a == -4) && a > sys_list[sys_top])//a为*号
{
sys_push(a);
}
else if ((a == -5 || a == -4 )&& a < sys_list[sys_top])//a为*号
{
if (sys_top == -1) {
sys_push(a);
}
else {
int a1 = num_pop();
int a2 = num_pop();
int s1 = sys_pop();
switch (s1) {
case -7:
result = a1 + a2;
break;
case -6:
result = a1 - a2;
break;
case -5:
result = a1 * a2;
break;
case -4:
result = a1 / a2;
break;
}
num_push(result);
sys_push(a);
}
}
else if (a == -3)//a为(号
{
sys_push(-8);
}
else if (a == -8)//a为)号
{
int a1 = num_pop();
int a2 = num_pop();
int s1 = sys_pop();
switch (s1) {
case -7:
result = a1 + a2;
break;
case -6:
result = a1 - a2;
break;
case -5:
result = a1 * a2;
break;
case -4:
result = a1 / a2;
break;
}
num_push(result);
sys_pop();
}
else if (a == -9)//a为=号
{
while (sys_list[0]!=0) {
int a1 = num_pop();
int a2 = num_pop();
int s1 = sys_pop();
switch (s1) {
case -7:
result = a1 + a2;
break;
case -6:
result = a1 - a2;
break;
case -5:
result = a1 * a2;
break;
case -4:
result = a1 / a2;
break;
}
num_push(result);
}
flag = false;
//输出结果
cout << "结果为:" << result << endl;
break;
}
}
}
c++用栈的思想写四则运算计算器
于 2024-11-19 12:17:37 首次发布