刷王道机试数据结构(一)栈部分的一道题
步骤:
1.将中缀表达式转为后缀表达式:
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次找出并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
2.将后缀表达式计算
1. 直接读取表达式,如果遇到数字就压栈。
2. 如果遇到运算符,就弹出两个数进行运算,随后再将运算结果压栈。注意这里的两个数,先弹出的是在运算符后面的。
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<stack>
using namespace std;
int priority(char c)
{
switch(c)
{
case '+':
case '-':
return 2;
case '*':
case '/':
return 3;
case '(':
return 4;
case '#':
return 1;
default:
return 0;
}
}
/*
中缀变后缀
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于找顶符号(乘除优先加减)则栈顶元素依次出找并输出,
并将当前符号进栈,一直到最终输出后缀表达式为止
*/
string transfer(string str)
{
stack<char>tfstack;
tfstack.push('#');
string tfstr;
for(int i = 0; i < str.size(); i++)
{
if(str[i] >= '0' && str[i] <= '9' && str[i+1] >= '0' && str[i+1] <= '9' )//解决9以上的多位数
{
string temp;
while(str[i] >= '0' && str[i] <= '9'){
temp += str[i];
i++;
}
i--;
tfstr += temp;
tfstr += ' ';
}
else
{
if(str[i] == '(')
tfstack.push(str[i]);
else if(str[i] == ')')
{
while(tfstack.top() != '(')
{
tfstr += tfstack.top();
tfstr += ' ';
tfstack.pop();
}
tfstack.pop();
}
else if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
{
while(priority(str[i]) <= priority(tfstack.top()) && tfstack.top() != '(')
{
tfstr += tfstack.top();
tfstr += ' ';
tfstack.pop();
}
tfstack.push(str[i]);
}
else
{
tfstr += str[i];
tfstr += ' ';
}
}
}
while(tfstack.top() != '#')
{
tfstr += tfstack.top();
tfstack.pop();
}
return tfstr;
}
int operat(int sc,int fr,char op)
{
switch(op)
{
case '+':
return sc + fr;
case '-':
return sc - fr;
case '*':
return sc * fr;
case '/':
return sc / fr;
default:
return 0;
}
}
/*
后缀表达式求和
1. 直接读取表达式,如果遇到数字就压栈。
2. 如果遇到运算符,就弹出两个数进行运算,随后再将运算结果压栈。
*/
int mysum(string str)
{
int i = 0,len = str.size();
stack<int>nstack;
while(i<len)
{
int num = 0,j = 0;//num计算数字,j代表数字的位数-1
while(str[i] >= '0' && str[i] <= '9')
{
num = num*j*10 + str[i] -48;//强制转换的结果为asc码,0的asc码为48
i++;
j++;
}
if(num)
nstack.push(num);
if(str[i] == ' ')
{
i++;
continue;
}
if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
{
int ft = nstack.top();//第一个弹出的数
nstack.pop();
int sc = nstack.top();//第二个弹出的数
nstack.pop();
nstack.push(operat(sc,ft,str[i]));
i++;
}
}
return nstack.top();
}
int main()
{
string str = "90+(3-1)*3+10/2";//90 3 1-3*+ 10 2/+
string tfstr = transfer(str);
cout<<mysum(tfstr)<<endl;
return 0;
}
害,果然自己考不上研是有原因的,初试就考的题,复试才搞明白!