乱世重典

--得天道之垂青 破地道之迂腐 尽人道灵性 

原创 中缀表达式转换为后缀表达式(C)收藏

新一篇: Hanoi塔问题(C) | 旧一篇: 编写程序实现n阶(n为奇数)魔方(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(); 
}


/*编写一个程序,实现中缀表达式向后缀表达式的转换。要求:
     键盘输入一个表达式,并以字符#表示结束;
     输出为后缀表达式形式。
*/
 

发表于 @ 2007年03月02日 11:42:00|评论(loading...)|收藏

新一篇: Hanoi塔问题(C) | 旧一篇: 编写程序实现n阶(n为奇数)魔方(C)

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © 重典