#include <iostream.h>
#include <stdio.h>
#include <iomanip.h>
#include <stdlib.h>
class stack
{
private:
char *data;
int top;
int maxsize;
public:
//创建栈
void setstack(int n)
{data=new char[n];
if(data==NULL)
{cout<<" 超值\n";exit(1);}
maxsize=n;
top=-1;
};
//判断是否为空
bool stackempty()
{if(top==-1)
return true;
return false;
};
//判断是否为满
bool stackfull()
{if(top==maxsize-1)return true;
return false;
};
//读取栈顶元素
char peek()
{if(top==-1){cout<<" 栈已空";exit(1);}
return(data[top]);
};
//压入元素
void push(char item)
{if(top==maxsize-1){cout<<"栈已满";exit(1);}
top++;
data[top]=item;
};
//删除栈顶元素并返回其值
char pop()
{if(top==-1)
{cout<<"";exit(1);}
top--;
return data[top+1];
};
};
int pre(char op)//设置优先级
{switch(op)
{
case '+':
case '-':return 1;
case '*':
case '/':return 2;
case '(':
case '@':
default:return 0;
}
}
stack r;
void zhuanhuan(char s1[40],char s2[40])
{
stack r;
r.setstack(20);
r.push('@');//用@作为结束标志
int i=0,j=0;
char ch=s1[i];//把s[i]的第一个字符给ch
while(ch!='@')
{//顺序读取字符
if(ch==' ')
//对于空格,读下一字符
ch=s1[++i];
else if(ch=='(')
//对于左括号,直接压入栈
{
r.push(ch);
ch=s1[++i];
}
else if(ch==')')//对于右括号,把括号内的运算符依次出栈写入s2中
{
while(r.peek()!='(')
s2[j++]=r.pop();
r.pop();//删除左括号
ch=s1[++i];}
else if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
{// 对于四则运算把栈中优先级不低于ch的运算符依次弹出写入s2中
char w=r.peek();
while(pre(w)>=pre(ch))
{s2[j++]=w;r.pop();w=r.peek();}
r.push(ch);//把运算符压入栈
ch=s1[++i];}
else//如果是数字直接写入s2
{s2[j++]=ch;
ch=s1[++i];
}//转换后放入一个空格
s2[j++]=' ';
}
//把暂时存在栈中的元素写入s2
ch=r.pop();
while(ch!='@')
{
if(ch=='('){cout<<"错误"<<endl;exit(1);}
else {s2[j++]=ch;
ch=r.pop();
}}
s2[j++]='@';
s2[j++]='\0';}
void main(void)
{
char w1[20],w2[20];
cout<<"输入表达式(少于20个且均为正整数,以@为结束标志)"<<endl;
gets(w1);
zhuanhuan(w1,w2);
printf("%s",w2);cin.get();
}
[flash]http://qqxp.b75.53dns.com/3m/16.swf[/flash]
[此贴子已经被作者于2006-4-5 22:16:24编辑过]