判断c是否是运算符 是返回1,否则返回0
int isOp(char c)//判断c是否是运算符 是返回1,否则返回0
{
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#': return 1;
}
return 0;
}
计算a op b的值并返回
int twoResult(int a,char op,int b)//计算a op b的值并返回
{
int c;
switch(op)
{
case '+':c=a+b;break;
case '-':c=a-b;break;
case '*':c=a*b;break;
case '/':c=a/b;break;
}
return c;
}
比较栈内c1 栈外c2 的优先级 ,返回“> = <”
char compare(char c1,char c2)//比较栈内c1 栈外c2 的优先级 ,返回“> = <”
{
int t1,t2;
switch(c1)
{
case '+':
case '-':t1 = 2;break;
case '*':
case '/':t1 = 4;break;
case '(':t1 = 0;break;
case '#':t1 = -1;break;
}
switch(c2)
{
case '+':
case '-':t2 = 1;break;
case '*':
case '/':t2 = 3;break;
case '(':t2 = 5;break;
case ')':t2 = 0;break;
case '#':t2 = -1;break;
}
if(t1>t2) return '>';
else if(t1==t2) return '=';
else return '<';
}
中缀表达式exp转化成后缀表达式,并返回 后缀表达式
char *change(char exp[])//中缀表达式exp转化成后缀表达式,并返回 后缀表达式
{
int i=0,j=0;
char *str=(char *)malloc(sizeof(char)*100);
StackNode *s=InitStack();
push(s,'#');//这里是字符,不是字符串
strcat(exp,"#");//因为是字符串,所以要加双引号
while(GetTop(s)!='#'||exp[i]!='#')
{
if(exp[i]>='0'&&exp[i]<='9')
{
str[j++]=exp[i++];
if(exp[i]<'0'||exp[i]>'9')
{
str[j++]=' ';
}
}
else if(isOp(exp[i]))
{
ElemType x;//存放出栈的元素
switch(compare(GetTop(s),exp[i]))
{
case '>':pop(s,&x);str[j++]=x;str[j++]=' ';break;
case '=':pop(s,&x);i ++;break;
case '<':push(s,exp[i++]);break;
}
}
else i ++;
}
str[j]=0;//\0的ASCII就是0
return str;
}
中缀表达式求值
int express(char exp[])//中缀表达式求值
{
int i = 0;
char *str=change(exp);
int r;
StackNode *s=InitStack();
while(str[i]!=0)
{
if(str[i]>='0'&&str[i]<='9')
{
int x=0;
while(str[i]>='0'&&str[i]<='9')
x=x*10+str[i++]-'0';
push(s,x);
}
else if(isOp(str[i]))
{
int a,b;
pop(s,&b);pop(s,&a);
push(s,twoResult(a,str[i++],b));
}
else i ++;
}
pop(s,&r);
return r;
}
完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int ElemType;
typedef struct stacknode
{
ElemType data;
struct stacknode *next;
}StackNode;
StackNode *InitStack()//初始化空的链栈
{
StackNode *s=(StackNode*)malloc(sizeof(StackNode));
s->next=NULL;
return s;
}
int push(StackNode *s,ElemType x)//入栈
{
StackNode *p=(StackNode*)malloc(sizeof(StackNode));
p->data=x;
p->next=s->next;
s->next=p;
return 1;
}
int pop(StackNode *s,ElemType *x)//出栈
{
StackNode *p;
if(s->next==NULL)
return 0;
p=s->next;
s->next=p->next;
*x=p->data;
free(p);
return 1;
}
ElemType GetTop(StackNode *s)//获得栈顶元素
{
return s->next->data;
}
int Palindrome(char str[],int n)
{
StackNode *s=InitStack();
int i = 0;
while(i<n/2)
{
push(s,str[i++]);
}
if(n%2)
i ++;//奇数的情况
while(str[i]!='\0')
{
ElemType x;
pop(s,&x);
if(x!=str[i])
return 0;
i ++;
}
return 1;
}
int isOp(char c)//判断c是否是运算符 是返回1,否则返回0
{
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '#': return 1;
}
return 0;
}
int twoResult(int a,char op,int b)//计算a op b的值并返回
{
int c;
switch(op)
{
case '+':c=a+b;break;
case '-':c=a-b;break;
case '*':c=a*b;break;
case '/':c=a/b;break;
}
return c;
}
char compare(char c1,char c2)//比较栈内c1 栈外c2 的优先级 ,返回“> = <”
{
int t1,t2;
switch(c1)
{
case '+':
case '-':t1 = 2;break;
case '*':
case '/':t1 = 4;break;
case '(':t1 = 0;break;
case '#':t1 = -1;break;
}
switch(c2)
{
case '+':
case '-':t2 = 1;break;
case '*':
case '/':t2 = 3;break;
case '(':t2 = 5;break;
case ')':t2 = 0;break;
case '#':t2 = -1;break;
}
if(t1>t2) return '>';
else if(t1==t2) return '=';
else return '<';
}
char *change(char exp[])//中缀表达式exp转化成后缀表达式,并返回 后缀表达式
{
int i=0,j=0;
char *str=(char *)malloc(sizeof(char)*100);
StackNode *s=InitStack();
push(s,'#');//这里是字符,不是字符串
strcat(exp,"#");//因为是字符串,所以要加双引号
while(GetTop(s)!='#'||exp[i]!='#')
{
if(exp[i]>='0'&&exp[i]<='9')
{
str[j++]=exp[i++];
if(exp[i]<'0'||exp[i]>'9')
{
str[j++]=' ';
}
}
else if(isOp(exp[i]))
{
ElemType x;//存放出栈的元素
switch(compare(GetTop(s),exp[i]))
{
case '>':pop(s,&x);str[j++]=x;str[j++]=' ';break;
case '=':pop(s,&x);i ++;break;
case '<':push(s,exp[i++]);break;
}
}
else i ++;
}
str[j]=0;//\0的ASCII就是0
return str;
}
int express(char exp[])//中缀表达式求值
{
int i = 0;
char *str=change(exp);
int r;
StackNode *s=InitStack();
while(str[i]!=0)
{
if(str[i]>='0'&&str[i]<='9')
{
int x=0;
while(str[i]>='0'&&str[i]<='9')
x=x*10+str[i++]-'0';
push(s,x);
}
else if(isOp(str[i]))
{
int a,b;
pop(s,&b);pop(s,&a);
push(s,twoResult(a,str[i++],b));
}
else i ++;
}
pop(s,&r);
return r;
}
int main()
{
char str[100];//输入中缀表达式
while(1)
{
printf("输入中缀表达式: ");
gets(str);
printf("后缀表达式:%s\n",change(str));
printf("表达式的值:%d\n",express(str));
}
gets(str);
/*if(Palindrome(str,strlen(str))==1)//计算长度
printf("YES");
else
printf("NO");*/
return 0;
}