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

本文介绍了一个程序,用于将中缀表达式转换为后缀表达式。该程序使用两个栈来处理运算符和操作数,通过输入一个包含基本算术运算符的中缀表达式,能够正确地输出对应的后缀表达式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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(); 
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值