四则运算--利用栈实现的核心算法
- 四则运算一开始我就是使用栈而实现算法(寒假期间参照网上的一些写法写的)
- 因此在这次作业中对于代码没有做修改
- github
以下为使用栈的核心算法:
double expresses::calculateResult(char * express)
{
double a, b; //两个操作数
char opera; //运算符
char c; //字符变量
char x = ' '; //x用来获取运算符栈栈顶的运算符
stack<char> oper;
stack<double> data; //运算符栈栈顶的运算符,操作数栈
int j = 0;
int i = 0;
oper.push('='); //先将定界符(=)推入操作符栈
c = express[i++];
double num = 0;
while (c != '=' || x != '=') //循环处理表达式中的每个字符
{
if (IsOperator(c)) //若是运算符
{
num = 0; //入栈之后清空某一个操作数的暂存值
switch (Priority(x, c))
{
case -1: //当前运算符c大于前一运算符x
//cout << "o----" << c << endl;
oper.push(c); //当前运算符进栈
c = express[i++]; //取表达式下一字符
break;
case 0: //括号(等号)配对
oper.pop(); //运算符左半部分出栈(抛弃)
c = express[i++]; //取表达式下一字符
break;
case 1: //当前运算符c小于等于前一运算符x
opera = oper.top(); //出栈之前取得栈顶元素
oper.pop(); //运算符出栈
b = data.top();
data.pop();
a = data.top();
data.pop(); //两个操作数出栈
double t = calculate(a, opera, b); //计算结果
if (t != (int)t) //解决除0再乘零的情况
return 0.1;
else
data.push(t); //将结算结果入栈
break;
}
}
else if (c >= '0' && c <= '9') //若输入的是数字字符 入栈
{
num = c - '0';
data.push(num);
c = express[i++];
}
x = oper.top(); //获取运算符栈顶的元素
}
num = data.top();
StackClear(oper);
StackClear(data); //清空两个栈
return num; //返回数字栈栈顶元素,即为计算结果
}
主要思想:
(发现讲话讲不清楚--还是画图好了)
(这应该是史上最丑的图了吧[捂脸])
写一下步骤:
1.运算符与数字先后入栈
2.判断运算符为 + 入栈,数字(可以不入栈),与数字栈栈顶元素按运算符相加,得到答案后入栈。
3.4.运算符判断是否与栈顶元素匹配,清栈。
5.6.7.8. 运算符入栈与数字栈出栈与读入数字进行运算
9.等号入栈判断结束,返回结果。
界面编程的初步探索
附上学习的网址
通过网上初步的学习,对MFC有初步的了解了。
在vs软件下,创建MFC
选择对话框形式,然后点击完成
添加编辑器和按钮,并且命名,给输入框添加变量,给按钮添加信息函数
添加变量:
按钮函数:
void CcalDlg::OnBnClickedButton1()
{
UpdateData(TRUE);
m_c= m_a + m_b;
UpdateData(FALSE);
}
void CcalDlg::OnBnClickedButton2()
{
UpdateData(TRUE);
m_c1 = m_a1 - m_b1;
UpdateData(FALSE);
}
void CcalDlg::OnBnClickedButton3()
{
UpdateData(TRUE);
m_c2 = m_a2 * m_b2;
UpdateData(FALSE);
}
void CcalDlg::OnBnClickedButton4()
{
UpdateData(TRUE);
m_c3 = m_a3 / m_b3;
UpdateData(FALSE);
}
运行结果:
(大概的初步了解就是这样子的吧,感觉做的很粗暴,很简单)