中缀表达式转换为后缀表达式(C)

#include < stdio.h >
#include
< stdlib.h >
#define  MAX 100
typedef 
struct
{
 
char  data[MAX];
 
int  top;
}Stack1;
typedef 
struct
{
 
char  data[MAX];
 
int  top;
}Stack2;
void  Init(Stack1  * stack1,Stack2  * stack2){
 stack1
-> top = stack2 -> top =- 1 ;
}
int  check( char  ch,Stack1  * stack1,Stack2  * stack2)
{
 
int  i;
 
switch (ch)
 {
case   ' + '
 
if (stack1 -> data[stack1 -> top] == ' - ' || stack1 -> data[stack1 -> top] == ' * ' || stack1 -> data[stack1 -> top] == ' / ' )
{
 stack2
-> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ];
 stack1
-> data[ ++ stack1 -> top] = ch;
}
else
 stack1
-> data[ ++ stack1 -> top] = ch;
return   1 ;
case   ' - ' :
if (stack1 -> data[stack1 -> top] == ' + ' || stack1 -> data[stack1 -> top] == ' * ' || stack1 -> data[stack1 -> top] == ' / ' )
{
 stack2
-> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ];
 stack1
-> data[ ++ stack1 -> top] = ch;
}

else
 stack1
-> data[ ++ stack1 -> top] = ch;
return   1 ;
case   ' * ' :
if (stack1 -> data[stack1 -> top] == ' / ' )
{
 stack2
-> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ];
 stack1
-> data[ ++ stack1 -> top] = ch;
 }
else
 stack1
-> data[ ++ stack1 -> top] = ch; 
return   1 ;
case   ' / ' :
if (stack1 -> data[stack1 -> top] == ' * '
{
 stack2
-> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ];
 stack1
-> data[ ++ stack1 -> top] = ch;
 }
else
 stack1
-> data[ ++ stack1 -> top] = ch;
 
return   1 ;
 
case   ' ) ' :
i
= stack1 -> top;
while (stack1 -> data[i] != ' ( '   &&  i >= 0 )i -- ;
 
if (i ==- 1 ) return   0 ;
while (stack1 -> data[stack1 -> top] != ' ( ' )
{
 stack2
-> data[ ++ stack2 -> top] = stack1 -> data[stack1 -> top -- ];
}
stack1
-> top -- ;
return   1 ;
 }
}
void  main(){
 
int  i,flag,k = 0 ,sum1,sum2;
 
char  ch[MAX];
 Stack1 
* stack1 = (Stack1  * )malloc( sizeof (Stack1));
 Stack2 
* stack2 = (Stack2  * )malloc( sizeof (Stack2));
 Init(stack1,stack2);
 printf(
" 请输入中缀表达式: " );
 gets(ch);
 
while (ch[k])
 {
if (ch[k] >= ' 0 ' && ch[k] <= ' 9 ' )
 stack2
-> data[ ++ stack2 -> top] = ch[k];
else   if (ch[k] == ' ( ' )
 stack1
-> data[ ++ stack1 -> top] = ch[k];
else   if (ch[k] == ' + '   || ch[k] == ' - ' || ch[k] == ' * '   ||  ch[k] == ' / ' || ch[k] == ' ) ' )
 flag
= check(ch[k],stack1,stack2);
 
if ( ! flag)  break ;
 k
++ ;
 }
 
if (flag)
 {
for (i = 0 ;i <= stack1 -> top;i ++ )
{
 
if (ch[i] == ' ( ' ) sum1 ++ ;
 
if (ch[i] == ' ) ' ) sum2 ++ ;
}
if (sum1 != sum2)
{
 printf(
" 表达式错误. " );
 
return ;
}
printf(
" 后缀表达式为: " );
for (i = 0 ;i <= stack2 -> top;i ++ )
 printf(
" %c " ,stack2 -> data[i]);
for (i = stack1 -> top;i >= 0 ;i -- )
 printf(
" %c " ,stack1 -> data[i]);
printf(
" " );
}
else
printf(
" 表达式错误. " );
getch(); 
}


/* 编写一个程序,实现中缀表达式向后缀表达式的转换。要求:
     键盘输入一个表达式,并以字符#表示结束;
     输出为后缀表达式形式。
*/
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值