中缀表达式转后缀表达式算法
使用栈进行辅助
对于符号±/(),定义为/优先级为2,’(’(左括号)优先级为3,右括号’)'优先级最低为0
对于一个表达式
如果当前字符为数字: 输出到输出队列中; 否则当前字符是运算符号或者括号时候: while 当前优先级大于栈顶优先级并且栈不空: 栈顶元素出栈加入到输出队列中; 将元素压入栈内; while 当前栈非空: 出栈返回栈顶元素;
对于左右括号问题
把左括号定义为 压入前是最高的优先级 压入后是最低优先级
这样一旦遇到左括号一定能被压入,并且压入后等级是最低的
定义右括号为第二低低的优先级 这样它就可以 一直pop栈元素
然后等遇到左括号 (左括号这个时候是最低的优先级)的时候
pop左括号
源码
#include <iostream>
#include <stack>
#include <cctype>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
map<char, int> ss;
ss['+'] = 1;
ss['-'] = 1;
ss['*'] = 2;
ss['/'] = 2;
stack<char> s;
string express;
while (cin >> express)
{
for (int i = 0; i < express.length(); i++)
{
if (isalpha(express[i]))
{
cout << express[i] << " ";
}
else if (express[i] == '(')
{
s.push(express[i]);
}
else if (express[i] == ')')
{
while (s.top() != '(')
{
cout << s.top() << " ";
s.pop();
}
s.pop();
}
//*/优先级高因此栈的栈顶是优先级高的
else
{
//cout << express[i];
// 当前栈顶的元素优先级大于当前零时字符
while (!s.empty() && ss[s.top()] >= ss[express[i]])
{
cout << s.top() << " ";
s.pop();
}
s.push(express[i]);
}
}
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
}
system("pause");
return 0;
}
运行结果
2018年11月13日更新:
实现中缀转后缀并且计算,用cpp类描述:
#include <iostream>
#include <cctype>
#include <map>
using namespace std;
//规定最大的大小
const int MaxElement = 16;
typedef char ElementType;
// typedef class mystack *Stack;
class mystack
{
private:
const int EmptyTOS = -1;
//允许的最小栈的大小
const int MinStackSize = 5;
int Capacity;
int TopOfStack;
ElementType *Array;
public:
void PrintStack()
{
if (TopOfStack == EmptyTOS)
{
cout << "empty!\n";
return;
}
for (int i = TopOfStack; i != EmptyTOS; i--)
{
printf("\t\t%d\n", Array[i]);
}
}
//判断是否为空栈
int isEmpty()
{
return TopOfStack == EmptyTOS;
}
//判断是否满栈
int isFull()
{
return TopOfStack == MaxElement;
}
//建栈
mystack()
{
if (MaxElement < MinStackSize)
{
printf("stack size is too small.\n");
exit(1);
}
Array = new ElementType[MaxElement];
Capacity = MaxElement;
MakeEmpty();
}
//销毁栈
~mystack()
{
delete[] Array;
}
//清空一个栈
//注意 有软删除和硬删除两种
//这里是软删除
//对于顺序存储只需要软删除即可达到硬删除的效果
void MakeEmpty()
{
TopOfStack = EmptyTOS;
}
//压栈
void push(ElementType X)
{
if (isFull())
{
printf("stack is full.\n");
exit(1);
}
else
{
Array[++TopOfStack] = X;
}
}
//返回栈顶元素
ElementType Top()
{
return Array[TopOfStack];
}
//弹出栈顶元素
void Pop()
{
if (isEmpty())
{
printf("empty stack.\n");
exit(1);
}
else
{
TopOfStack--;
}
}
//返回栈顶元素并且pop操作
ElementType TopAndPop()
{
if (isEmpty())
{
printf("empty stack.\n");
exit(1);
}
else
{
return Array[TopOfStack--];
}
}
};
int main(int argc, char const *argv[])
{
int ss[256] = {0};
ss['+'] = 1;
ss['-'] = 1;
ss['*'] = 2;
ss['/'] = 2;
int ans = 0;
class mystack s;
class mystack s2;
//stack<char> s;
string express;
string res="";
while (getline(cin, express))
{
if (express[0] == '#')
{
break;
}
for (int i = 0; i < express.length(); i++)
{
if (isspace(express[i]))
{
continue;
}
if ((express[i]) >= '0' && express[i] <= '9')
{
cout << express[i] << " ";
res += express[i];
}
else if (express[i] == '(')
{
s.push(express[i]);
}
else if (express[i] == ')')
{
while (s.Top() != '(')
{
cout << s.Top() << " ";
res += s.Top();
s.Pop();
}
s.Pop();
}
//*/优先级高因此栈的栈顶是优先级高的
else
{
//cout << express[i];
// 当前栈顶的元素优先级大于当前零时字符
while (!s.isEmpty() && ss[s.Top()] >= ss[express[i]])
{
cout << s.Top() << " ";
res += s.Top();
s.Pop();
}
s.push(express[i]);
}
}
while (!s.isEmpty())
{
cout << s.Top() << " ";
res += s.Top();
s.Pop();
}
cout << endl;
cout<<"res="<<res<<endl;
for (int i = 0; i < res.length(); i++)
{
if ((res[i]) == '+' || res[i] == '-' || res[i] == '*' || res[i] == '/')
{
int temp = 0;
int t1 = s2.Top() - '0';
s2.Pop();
int t2 = s2.Top() - '0';
s2.Pop();
switch (res[i])
{
case '+':
temp = t2 + t1;
break;
case '-':
temp = t2 - t1;
break;
case '*':
temp = t2 * t1;
break;
case '/':
temp = t2 / t1;
break;
}
//printf("temp=%d\n",temp);
temp = temp + '0';
s2.push((char)temp);
}
else if ((res[i]) >= '0' && res[i] <= '9')
{
s2.push(res[i]);
}
}
cout << s2.Top() - '0' << endl;
}
system("pause");
return 0;
}