c 中缀转后缀

原创 2007年09月22日 12:51:00
#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]>='a'&&ch[k]<='z' || ch[k]>='A'&&ch[k]<='Z')
 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();
}
 

软件复用为软件开发提速

软件复用为软件开发提速四木(本文转载自软件工程专家网www.21cmm.com)    随着社会信息化程度的提高,IT技术已经深入到社会生活的方方面面,而软件作为IT技术应用的核心,其重要性也日渐突出...
  • gigix
  • gigix
  • 2002-04-09 09:37:00
  • 1353

用C语言写解释器(三)——中缀转后缀

声明为提高教学质量,我所在的学院正在筹划编写C语言教材。《用C语言写解释器》系列文章经整理后将收入书中“综合实验”一章。因此该系列的文章主要阅读对象定为刚学完C语言的学生(不要求有数据结构等其他知识)...
  • redraiment
  • redraiment
  • 2009-11-01 22:25:00
  • 8505

【1分】表达式中缀转后缀C++代码

  • 2017年09月10日 19:28
  • 14KB
  • 下载

栈练习之C语言中实现中缀转后缀表达式

#include #include #include #include #include "Myatoi.c" extern int myatoi(const char *str); #def...
  • lwb102063
  • lwb102063
  • 2016-06-29 20:37:05
  • 2526

中缀转后缀表达式计算实现源码(C++、Java)

  • 2017年01月29日 18:59
  • 5KB
  • 下载

栈——中缀表达式转后缀表达式

中缀表达式转后缀表达式的算法较为简单,采用栈来实现。规则如下: 遇到数字:直接输出遇到'(':压栈遇到')':持续出栈,如果出栈的符号不是'('则输出,否则终止出栈。遇到符号则判断该符号与栈顶符号...
  • girlkoo
  • girlkoo
  • 2013-12-20 09:35:35
  • 20184

后缀式转中缀式(C语言)

  • 2010年04月09日 15:36
  • 2KB
  • 下载

中缀表达式转后缀表达式求值(模板)

///中缀表达式转后缀表达式 #include #include const int MAX=100; using namespace std; char pp[MAX];//存储转换后的后缀表达式 ...
  • xiaosshhaa
  • xiaosshhaa
  • 2016-09-29 21:07:55
  • 1390

表达式求值(中缀转后缀及后缀表达式求值)

。中缀表达式转后缀表达式:中缀表达式转后缀表达式遵循以下原则: 1.遇到操作数,直接输出; 2.栈为空时,遇到运算符,入栈; 3.遇到左括号,将其入栈;...
  • qq_34992845
  • qq_34992845
  • 2017-04-21 13:05:59
  • 2983

中缀转后缀求值

  • 2011年11月01日 19:51
  • 5KB
  • 下载
收藏助手
不良信息举报
您举报文章:c 中缀转后缀
举报原因:
原因补充:

(最多只允许输入30个字)