Push(h1,z[i]);//将当前字符压入逆序的逆波兰式栈 h1
else if(z[i]=='(')//如果当前字符是"("
Push(fh,'(');//将当前字符压入符号栈 fh
else if(z[i]==')')//如果当前字符是")"
{
while(GetTop(fh)!='(')//一直删除符号栈 fh 的栈顶元素只至"("
Pop(fh,h1,1);
Pop(fh,fh,3);
//并将其压入逆序的逆波兰式栈 h1
//删除符号栈 fh 的栈顶元素,即"("
}
else if(z[i]=='#')//如果当前字符是"#"
{
while(GetTop(fh)!='#')//一直删除符号栈 fh 的栈顶元素只至"#"
Pop(fh,h1,1);
//并将其压入逆序的逆波兰式栈 h1
}
else //否则就判断当前字符和符号栈的栈顶元素的优先级
cmp(z[i],GetTop(fh),fh,h1);//并执行相应的操作
}
while(!EmptyStack(h1))//如果逆序的逆波兰式栈 h1 非空就删除其栈顶元素
Pop(h1,h2,1);//并将其压入正序的逆波兰式栈 h2
cout<<"***************************************"<>a;
if(a==1)
goto kind1;
return 1;
}
int InitStack(STACK&S)//构造空栈 S
{
S.base=(SElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if(!S.base) exit (OVERFLOW);
S.top=S.base;
S.stacksize =STACK_INIT_SIZE ;
return 1;
}
char GetTop(STACK &S)//若栈不空,返回 S 的栈顶元素,否则返回 ERROR;
{
if(S.top==S.base) return 0;
ElemType e=*(S.top-1);
return e;
}
int Push (STACK &S,SElemType e)//插入 e 为新的栈顶元素
{
if(S.top-S.base>=S.stacksize)
{
S.base =(ElemType *) realloc (S.base ,
(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!S.base )exit (OVERFLOW);
S.top=S.base +S.stacksize;
S.stacksize +=STACKINCREMENT;
}
*S.top++=e;
return 1;
}
int Pop (STACK &S,STACK &H,int m)//若栈不空,则删除 S 的栈顶元素,
//并返回 OK,否则返回 ERROR
{
if(S.top==S.base ) return 0;
ElemType e=*--S.top ;//删除栈顶元素并用 e 返回其值
switch(m)
{
case 1://m==1 时把栈顶元素压入 H 栈
Push(H,e);
break;
case 2://m==2 时输出栈顶元素
cout<
case '(':
case '=':
case '#':
return 1;
break;
case '*':
case '/':
return 0;
break;
}
}
while(a=='+'||a=='-')//运算符+和-的优先级高于运算符(,=,#
{
//但低于等于运算符*,/,+,-
switch(b)
{
case '(':
case '=':
case '#':
return 1;
break;
case '*':
case '/':
case '+':
case '-':
return 0;
break;
}
}
while(a=='(')//运算符(的优先级高于运算符=,#
{
//但低于等于运算符*,/,+,-,(
switch(b)
{
case '=':
case '#':
return 1;
break;
case '*':
case '/':
case '+':
case '-':
case '(':
return 0;
break;
}
}
while(a=='=')//运算符=的优先级高于运算符#
{
//但低于等于运算符*,/,+,-,(,=
switch(b)
{
case '#':
return 1;
break;
case '*':
case '/':
case '+':
case '-':
case '(':
case '=':
return 0;
break;
}
}
while(a=='#')//运算符#的优先级低于所有其他运算符
{
//但等于运算符#
switch(b)
{
case '*':
case '/':
case '+':
case '-':
case '(':
case '=':
case '#':
return 0;
break;
}
}
return 1;
}
void cmp(char a,char b,STACK &f,STACK &h)//判断运算符 a 和 b 的优先级
{
if(cmp(a,b))//如果运算符 a 的优先级高于运算符 b
Push(f,a);//就把 a 压入栈 f
else//如果运算符 a 的优先级低于等于运算符 b
{
Pop(f,h,1);//删除栈 f 的栈顶元素并将其压入栈 h
cmp(a,GetTop(f),f,h);//继续判断运算符 a 和栈 f 的栈顶元素的优先级
}
}
三、主要仪器设备及
装有 VC++6.0 的计算机
第二部分:实验调试与结果分析(可加页)
实验小结、建议及体会
通过此次试验我对赋值语句翻译成逆波兰式有了进一步的认识,加深了我对书本知识的学
习,同时也锻炼了自己的编程能力。