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

C/C++的中缀转后缀并求值的实现

C/C++实现简单的中缀转后缀并求值

C/C++ 算法 中缀转后缀表达式实现2---实现加减乘除四则算数(整型,包括括号)

C/C++ 算法 中缀表达式转换位后缀表达式实现2---实现加减乘除四则算数(整型,包括括号) 中缀(infix)表达式:即人们常用的算数逻辑表达式,其特点是操作符位于操作数的中间,如表达式:a+b*...
  • asxutao
  • asxutao
  • 2015年08月25日 16:49
  • 11660

SzNOI c003 中缀表达式转后缀表达式

个人觉得我写的应该是目前网上写的版本比较简单的了。。。这也是我开博客的原因,尽量写出简单的代码,一方面可以巩固自己,一方面也能方便别人 中缀表达式转化为后缀表达式是通过栈实现 思路是,写两个函数,分别...
  • hhooong
  • hhooong
  • 2015年01月25日 23:26
  • 462

中缀转后缀

  • 2015年10月11日 11:34
  • 2KB
  • 下载

中缀式与后缀式的转化 郁闷的C小加(一)

郁闷的C小加(一) 题目来源:http://acm.nyist.net/JudgeOnline/problem.php?pid=257 时间限制:1000 ms  |  内存限制:65535 KB...

中缀表达式转后缀

  • 2013年12月22日 13:27
  • 528KB
  • 下载

nyoj 467 中缀式变后缀式 nyoj 257 郁闷的C小加(一)

中缀式变后缀式 思路:从左到右扫描表达式,若为操作数,直接输出,若为操作符,则样将当前操作符和操作符栈的栈顶操作符进行优先级比较。 (1).若当前操作符优先级大于操作符栈的栈顶操作符,则将当前操作...

中缀表达式转后缀表达式树

  • 2010年06月05日 23:07
  • 2.35MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c 中缀转后缀
举报原因:
原因补充:

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