看了数据结构与算法这本书,用刚学的栈写了一个能实现简单四则运算的小程序
主要是处理括号的问题
大概思路:
中缀表达式-》前缀表达式-》计算
#include<iostream>
#include<stack>
#include<vector>
#include<string>
using namespace std;
stack<double> Calculate;
int priority(char x)//优先级
{
switch (x)
{
case '+':case '-': return 1;
case '*':case '/': return 2;
case '(': return 3;
case ')': return 0;
}
}
void pop_two(double &t1, double &t2)//出栈2个
{
t1 = Calculate.top();
Calculate.pop();
t2 = Calculate.top();
Calculate.pop();
}
int main()
{
cout << "只能计算0到9之间数字的四则运算(),+,-,*,/:" << endl;
vector<char> Vec;
stack<char> Stack;
vector<char> Output;
double Tem1,Tem2;//临时值
char Sign;
while (cin >> Sign )
{
if (Sign == '=')
break;
Vec.push_back(Sign);
}
//中辍转换为后缀
for (auto &v : Vec)
{
//数字直接进vector
if (v <= '9'&&v>='0')
{
Output.push_back(v);
}
//不是数字时
else
{
//情况1:v的优先级大于栈顶元素的优先级时,v入栈
if (Stack.size() == 0 || priority(v) > priority(Stack.top()) || priority(Stack.top())==3)
{
Stack.push(v);
}
//情况2:遇到)时候
else if (priority(v) == 0)
{
while (priority(Stack.top()) != 3)
{
Output.push_back(Stack.top());
Stack.pop();
}
Stack.pop();
}
//情况3:不是)时候,v的优先级小鱼栈顶元素,栈顶元素出栈,直到发现优先级更低的元素( 除非是在处理”)“时候,否则不能移走”(” )
else
{
while (Stack.size() != 0 && priority(v) <= priority(Stack.top()) && priority(Stack.top())!=3)
{
Output.push_back(Stack.top());
Stack.pop();
}
Stack.push(v);
}
}
}
while (Stack.size() != 0)
{
Output.push_back(Stack.top());
Stack.pop();
}
//for (auto &s : Output)
//{
// cout << s << " ";
//}
//计算后缀表达式
for (auto &v : Output)
{
//数字时候
if (v <= '9'&&v >= '0')
{
Calculate.push(v-'0');//char变成数字
}
//符号时候
else
{
pop_two(Tem1, Tem2);
switch (v)
{
case '+':
Calculate.push(Tem1+Tem2);break;
case '*':
Calculate.push(Tem1*Tem2); break;
case '-':
Calculate.push(Tem2 - Tem1); break;
case '/':
Calculate.push(Tem2 / Tem1);break;
//这里出BUG了。。。。我把数字和符号都放在了vector<char>..只能实现整数的四则运算
}
}
}
cout << Calculate.top();
return 0;
}
我是直接用了C++里面封装好的stack类,不过C语言实现起来也一样的。
栈有3个重要的函数,出栈,入栈,栈顶提取。
void
Push(ElementType X,Stack S)
{
PtrNode TmpCell;
TmpCell=malloc(sizeof(struct Node));
if(TmpCell==NULL)
FalalError("out of space");
TmpCell->Element=X;
TmpCell->Next==S->Next;
S->Next=TmpCell;
}
/*find*/
ElementType
Top(Stack S)
{
if(!IsEmpty(S))
return S->Next->Element;
Error("empty stack");
return 0;
}
/*delete*/
void
Pop(Stack S)
{
PtrNode TmpCell;
if(!IsEmpty(S))
{
TmpCell=S->Next;
S->Next==S->Next->Next;
free(TmpCell);
}
else
Error("empty stack");
}