先看了一下栈的基本原理,也就是所谓的后进先出,然后就想完整的学习一下逆波兰表达式。下午刚上完工程制图(工程制图没认真听啊orz.....),回来就想着先写第一部分吧。
前面说了一堆废话,先给个例子
9+(3-1)×3+10/2 --------> 931-3*+102/+
将中缀表达式转化成后缀表达式,原理很简单,我先做一个关于没有“(”与“)”的例子,来简单的解释一下这个过程。
先贴代码:
//只对+-*/进行处理,不包含'(',')'的代码(本人菜得抠脚,所以....只能先写这个,而且对于数字之间也没有进行空格处理,第一个版本很粗糙啦)
char* change(char* m1)
{
int i,j;
i=j=0; //i和j分别表示m1与m2存放到的位置
char* m2=new char [100];
memset(m2,' ',sizeof(m2));
stack <char> t; //定义一个栈队列
while(m1[i]!='\0') //如果m1没有结束的话,就做循环
{
if(m1[i]>='0'&&m1[i]<='9') //1-9直接输出,没什么原理
{
m2[j++]=m1[i++];
}
else if(m1[i]=='+'||m1[i]=='-')//因为“+”和“-”是运算优先级最小的,所以栈队列内的所有符号都加入m2,再把当前的压进去
{
while(t.size()!=0)
{
m2[j++]=t.top();
t.pop();
}
t.push(m1[i++]);
}
else if(m1[i]=='*'||m1[i]=='/')//“*”和“/”属于运算级高的,所以如果遇到“+”,“-”,就压进去,同等级的就取出来
{
while(t.size()!=0)
{
if(t.top()=='+'||t.top()=='-')
{
break;
}
else
{
m2[j++]=t.top();
t.pop();
}
}
t.push(m1[i++]);
}
}
while(t.size()!=0) //最后把t队列里的全取出来
{
m2[j++]=t.top();
t.pop();
}
return m2;
}
//写了20分钟,改好了有括号功能的change函数了
代码2,因为思路和上面差不多,对照着看就可以看懂了
char* change(char* m1)
{
int i,j;
i=j=0;
char* m2=new char [10];
memset(m2,' ',sizeof(m2));
stack <char> t;
while(m1[i]!='\0')
{
if(m1[i]>='0'&&m1[i]<='9')
{
m2[j++]=m1[i++];
}
else if(m1[i]=='+'||m1[i]=='-')
{
while(t.size()!=0&&t.top()!='(')
{
m2[j++]=t.top();
t.pop();
}
t.push(m1[i++]);
}
else if(m1[i]=='*'||m1[i]=='/')
{
while(t.size()!=0&&t.top()!='(')
{
if(t.top()=='+'||t.top()=='-')
{
break;
}
else
{
m2[j++]=t.top();
t.pop();
}
}
t.push(m1[i++]);
}
else if(m1[i]=='(')
{
t.push(m1[i++]);
}
else if(m1[i]==')')
{
while(t.top()!='(')
{
m2[j++]=t.top();
t.pop();
}
if(t.top()=='(') t.pop();
i++;
}
}
while(t.size()!=0)
{
m2[j++]=t.top();
t.pop();
}
return m2;
}
ok,今天先写到这里吧,下回把后缀表达式的运算方法写成代码贴出来,好烦啊,去写实验报告以及工程制图作业去了
over