(1) 0-2^32 位 之间 , 考虑数字大于10的情况.
(2) C/C++实现
(3) 中缀转后缀调用 栈stack
(4) 后缀求值,用自己定义的栈求值
思路:
初始化两个栈:运算符栈s1和储存中间结果的栈s2;
从左至右扫描中缀表达式;
遇到操作数时,将其压s2;
遇到运算符时,比较其与s1栈顶运算符的优先级:
如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;
否则,若优先级比栈顶运算符的高,也将运算符压入s1(注意转换为前缀表达式时是优先级较高或相同,而这里则不包括相同的情况);
否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较;
遇到括号时:
如果是左括号“(”,则直接压入s1;
如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃;
重复步骤2至5,直到表达式的最右边;
将s1中剩余的运算符依次弹出并压入s2;
依次弹出s2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式(转换为前缀表达式时不用逆序)
实现:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef struct sstack{
int top;
int *data;
int MaxSize;
void InitStack(int sz){
MaxSize = sz;
data = new int[sizeof(int)*MaxSize];
top = -1;
}
void FreeStack(){
free(data);
}
void MakeEmpty(){
top = -1;
}
bool IsEmpty(){
return top ==-1;
}
bool IsFull(){
return top == MaxSize-1;
}
int Push(int item){
if(!IsFull()){
data[++(top)] = item;
return 0;
}
return -1;
}
int Pop(){
if(!IsEmpty()){
return data[(top) --];
}
return -1;
}
int GetTop(){
if(!IsEmpty()){
return data[top];
}
return -1;
}
}Stack;
string zh_str = "(2*(3+4)+5)*6-6/3";
string af_str ="";
int fir[128];
void init()
{
fir['+']=fir['-'] = 1;
fir['*']=fir['/'] = 2;
}
void Work1()
{
stack<char>S1;
int len = zh_str.length();
int cot = 0 ;
for(int i = 0 ; i < len ; i++)
{
if(zh_str[i]==' ')
continue;
if(zh_str[i]>='0' && zh_str[i]<='9')
{
int tempnum = 0 ;
while(zh_str[i]>='0' && zh_str[i]<='9'){
tempnum = tempnum*10 + (zh_str[i++]-'0');
}
i--;
af_str += tempnum +'0';
af_str +=' ' ;
}
else if(zh_str[i]=='(') // 左括号直接进栈
{
S1.push(zh_str[i]);
}
else if(zh_str[i]==')') // 遇到右括号 依次出栈 直到碰到 (
{
while(S1.top()!='(' && !S1.empty())
{
af_str += S1.top();
af_str +=' ' ;
S1.pop();
}
S1.pop();// "(" 出栈
}
else // 处理 符号优先级的问题
{
if(S1.empty())
{
S1.push(zh_str[i]);
}
else{
while(!S1.empty() && S1.top()!='(' && fir[S1.top()] >= fir[zh_str[i]] )
{
af_str += S1.top();
af_str +=' ' ;
S1.pop();
}
S1.push(zh_str[i]);
}
}
}
while(!S1.empty()){ // 栈中所有元素出栈
af_str += S1.top();
af_str +=' ' ;
S1.pop();
}
cout<<"after polish : "<<endl;
cout<<af_str<<endl;
}
void Work2()
{
Stack SK;// 自定义栈;
SK.InitStack(100);
int len = af_str.length();
for(int i = 0 ; i < len ; i++)
{
if(af_str[i] == ' ')
continue;
if(af_str[i]>='0' && af_str[i]<='9')
{
int tempnum = 0 ;
while(af_str[i]>='0' && af_str[i]<='9'){
tempnum = tempnum*10 + (af_str[i++]-'0');
}
i--;
SK.Push(tempnum);
}
else{
int k ;
switch(af_str[i]){
case '+':
k = SK.Pop() + SK.Pop();
SK.Push(k);
break;
case '-':
k = SK.Pop();
k = SK.Pop() - k;
SK.Push(k);
break;
case '*':
k = SK.Pop() * SK.Pop();
SK.Push(k);
break;
case '/':
k = SK.Pop();
k = SK.Pop() / k;
SK.Push(k);
break;
}
}
}
cout<<"the ans is : "<<SK.Pop()<<endl;
}
int main()
{
init();
Work1();
Work2();
return 0;
}