1、页面设置
1.1结果界面展示
其中操作符按钮与数字按钮使用网格布局,需注意,“=”按钮的大小需要另外设置
代码为:
ui->equalButton->setMinmumiSize(85, 80);
ui->equalButton->setMaximumSize(85, 80);
2、槽函数逻辑
2.1数字和运算符按钮槽函数
在头文件中定义QString expression = "";
以数字1按钮为例,其槽函数代码为:
expression += "1";
ui->lineEdit->setText(expression);
2.2“C”和“<—”按钮槽函数
“C”按钮槽函数代码为:
expression.clear();
ui->lineEdit->clear();
“<—”按钮槽函数代码为:
expression.chop(1);
ui->lineEdit->setText(expression);
2.3“=”按钮槽函数
该简易四则运算器使用栈将中缀表达式变换为后缀表达式,上述expression中存储的即为中缀表达式。
QStack<int> s_sum, s_opt;//分别存储数字和运算符的栈
char opt[128] = {0};//数组,存储expression的数据
int i = 0, tmp = 0, num1, num2;
//把QString转换为char *
QByteArray ba = expression.toLocal8Bit();
strcpy(opt, ba.data());
while(opt[i] != '\0' || s_opt.empty() != true){
if(opt[i] >= '0' && opt[i] <= '9'){
//将数字由string转换为int并且入数字栈
tmp = tmp * 10 + opt[i] - '0';//将string转换为int
i++;
if(opt[i] < '0' || opt[i] > '9'){//判断接下来的数据是否是运算符号,如果是运算符号那么将当前的int数据入栈
s_sum.push(tmp);
tmp = 0;
}
}else{//进行运算符的入栈和计算
if(s_opt.empty() == true || (Priority(opt[i]) > Priority(s_opt.top())) || (s_opt.top() == '(' && opt[i] != ')') ){
//直接入栈的三种情况:1、当前栈为空 2、当前运算符的优先级高于栈顶运算符 3、栈顶运算符为“(”,当前运算符不是“)”
s_opt.push(opt[i]);
i++;
continue;
}
if(s_opt.top() == '(' && opt[i] == ')'){
//直接出栈的情况:栈顶运算符为“(”, 当前运算符为“)”,即不进行任何运算
s_opt.pop();
i++;
continue;
}
if(Priority(opt[i]) <= Priority(s_opt.top()) || (opt[i] == ')' && s_opt.top() != '(') || (opt[i] == '\0' && s_opt.empty() != true)){
//进行运算的三种情况:1、当前运算符的优先级低于栈顶运算符(先乘除后加减) 2、当前运算符为“)”, 先进行括号内的运算 3、expression遍历结束而运算符栈非空时
char ch = s_opt.pop();
switch(ch){//注意栈先进后出的特点,后出栈的是第一个操作数
case '+':
num1 = s_sum.pop();
num2 = s_sum.pop();
s_sum.push(num2 + num1);
//qDebug()<< num2 <<" " << num1 << " " <<num1+num2;
break;
case '-':
num1 = s_sum.pop();
num2 = s_sum.pop();
s_sum.push(num2 - num1);
//qDebug()<< num2 <<" " << num1 << " " <<num2-num1;
break;
case '*':
num1 = s_sum.pop();
num2 = s_sum.pop();
s_sum.push(num2 * num1);
//qDebug()<< num2 <<" " << num1 << " " <<num2*num1;
break;
case '/':
num1 = s_sum.pop();
num2 = s_sum.pop();
s_sum.push(num2 / num1);
//qDebug()<< num2 <<" " << num1 << " " <<num2/num1;
break;
}
}
}
}
int res = s_sum.pop();
//qDebug()<< 4+(8-2*3)+9/5;
ui->lineEdit->setText(QString::number(res));
expression.clear();
- 循环结束的条件:中缀表达式遍历完成并且运算符栈为空