数据结构C语言利用堆栈表达式求值
来源:互联网 发布:淘宝客qq群推广违规吗 编辑:程序博客网 时间:2024/04/28 16:37
#include<stdio.h>
#define maxsize 100//定义表达式字符的最大容量
struct
{
char ch;
int pri;
}//设定运算符优先级的结构体
lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
int leftpri(char op)
{
int i;
for(i=0;i<7;i++)
if(lpri[i].ch==op)return lpri[i].pri;
}//判断左运算符
int rightpri(char op)
{
int i;
for(i=0;i<7;i++)
if(rpri[i].ch==op)return rpri[i].pri;
}//判断右运算符
int inop(char ch)
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else return 0;
}//判断该字符是否为运算符
int precede(char op1,char op2)//比较两个运算符的优先级
{
if(leftpri(op1)==rightpri(op2))return 0;
else if (leftpri(op1)<rightpri(op2))return -1;
else return 1;
}
void trans(char *exp,char postexp[])//将我们输入的表达式变成系统能识别的表达式
{
struct
{
char data[maxsize];
int top;
} op;//定义存放运算符的栈
int i=0;
op.top=-1;
op.top++;
op.data[op.top]='=';//将等号进栈
while(*exp!='\0')//当表达式还没有表达完
{
if(!inop(*exp))//判断是数字字符
{
while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;//将数字放在专门的数组里
exp++;
}
postexp[i++]='#';//加个'#'表明已经扫描完毕
}
else
switch(precede(op.data[op.top],*exp))//根据运算符优先级进行判断
{
case -1:op.top++;
op.data[op.top]=*exp;
exp++;
break;
case 0:op.top--;exp++;break;
case 1:postexp[i++]=op.data[op.top];
op.top--;break;
}
}
while(op.data[op.top]!='=')//一直执行退栈,直到遇到等号为止
{
postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0';
}
float comvalue(char *postexp)//计算后缀表达式的值
{
struct
{
float data[maxsize];
int top;
}st;
float d,a,b,c;
st.top=-1;
while(*postexp!='\0')
{
switch(*postexp)
{
case'+':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a+b;
st.top++;
st.data[st.top]=c;
break;
case'-':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b-a;
st.top++;
st.data[st.top]=c;
break;
case'*':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a*b;
st.top++;
st.data[st.top]=c;
break;
case'/':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
if(a)
{
c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{
printf("被除数不能为0\n");
return 0;
}
break;
default:d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+ *postexp-'0';
postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++;
}
return(st.data[st.top]);
}
int main()
{int i,a=1;
while(a){
char exp[maxsize];
printf("请输入表达式(按回车键结束):\n");
gets(exp);
char postexp[maxsize];
trans(exp,postexp);
printf("您输入的表达式为:%s\n",exp);
printf("后缀表达式为:%s\n",postexp);
printf("计算结果为:%g\n",comvalue(postexp));
printf("********************************************\n");
}
}
#define maxsize 100//定义表达式字符的最大容量
struct
{
char ch;
int pri;
}//设定运算符优先级的结构体
lpri[]={{'=',0},{'(',1},{'*',5},{'/',5},{'+',3},{'-',3},{')',6}},
rpri[]={{'=',0},{'(',6},{'*',4},{'/',4},{'+',2},{'-',2},{')',1}};
int leftpri(char op)
{
int i;
for(i=0;i<7;i++)
if(lpri[i].ch==op)return lpri[i].pri;
}//判断左运算符
int rightpri(char op)
{
int i;
for(i=0;i<7;i++)
if(rpri[i].ch==op)return rpri[i].pri;
}//判断右运算符
int inop(char ch)
{
if(ch=='('||ch==')'||ch=='+'||ch=='-'||ch=='*'||ch=='/')
return 1;
else return 0;
}//判断该字符是否为运算符
int precede(char op1,char op2)//比较两个运算符的优先级
{
if(leftpri(op1)==rightpri(op2))return 0;
else if (leftpri(op1)<rightpri(op2))return -1;
else return 1;
}
void trans(char *exp,char postexp[])//将我们输入的表达式变成系统能识别的表达式
{
struct
{
char data[maxsize];
int top;
} op;//定义存放运算符的栈
int i=0;
op.top=-1;
op.top++;
op.data[op.top]='=';//将等号进栈
while(*exp!='\0')//当表达式还没有表达完
{
if(!inop(*exp))//判断是数字字符
{
while(*exp>='0'&&*exp<='9')
{
postexp[i++]=*exp;//将数字放在专门的数组里
exp++;
}
postexp[i++]='#';//加个'#'表明已经扫描完毕
}
else
switch(precede(op.data[op.top],*exp))//根据运算符优先级进行判断
{
case -1:op.top++;
op.data[op.top]=*exp;
exp++;
break;
case 0:op.top--;exp++;break;
case 1:postexp[i++]=op.data[op.top];
op.top--;break;
}
}
while(op.data[op.top]!='=')//一直执行退栈,直到遇到等号为止
{
postexp[i++]=op.data[op.top];
op.top--;
}
postexp[i]='\0';
}
float comvalue(char *postexp)//计算后缀表达式的值
{
struct
{
float data[maxsize];
int top;
}st;
float d,a,b,c;
st.top=-1;
while(*postexp!='\0')
{
switch(*postexp)
{
case'+':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a+b;
st.top++;
st.data[st.top]=c;
break;
case'-':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=b-a;
st.top++;
st.data[st.top]=c;
break;
case'*':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
c=a*b;
st.top++;
st.data[st.top]=c;
break;
case'/':a=st.data[st.top];
st.top--;
b=st.data[st.top];
st.top--;
if(a)
{
c=b/a;
st.top++;
st.data[st.top]=c;
}
else
{
printf("被除数不能为0\n");
return 0;
}
break;
default:d=0;
while(*postexp>='0'&&*postexp<='9')
{
d=10*d+ *postexp-'0';
postexp++;
}
st.top++;
st.data[st.top]=d;
break;
}
postexp++;
}
return(st.data[st.top]);
}
int main()
{int i,a=1;
while(a){
char exp[maxsize];
printf("请输入表达式(按回车键结束):\n");
gets(exp);
char postexp[maxsize];
trans(exp,postexp);
printf("您输入的表达式为:%s\n",exp);
printf("后缀表达式为:%s\n",postexp);
printf("计算结果为:%g\n",comvalue(postexp));
printf("********************************************\n");
}
}
0 0
- 数据结构C语言利用堆栈表达式求值
- 利用堆栈实现表达式求值
- 数据结构c语言实现表达式求值
- c语言数据结构实现后缀表达式求值
- 表达式求值c语言
- 利用堆栈实现后缀表达式求值
- NYOJ-35-表达式求值(C语言数据结构)
- c语言表达式求值顺序
- C语言表达式求值顺序
- C++表达式求值(利用数据结构栈)
- c++表达式求值(利用数据结构栈)
- C语言中缀表达式转后缀表达式并利用后缀表达式求值 (小于10)
- 堆栈应用:表达式求值
- 表达式求值 【堆栈】
- 堆栈实现表达式求值
- 数据结构之---C语言实现栈的表达式求值(表达式树)
- C语言数据结构之堆栈
- 数据结构C语言版之表达式求值
- QT中点击按钮打开文件对话框的程序并在标签中显示
- Java 内存分配全面浅析
- Codeforces Round #337 (Div. 2) 战报
- Codeforces Round #337 (Div. 2) 610B Vika and Squares(脑洞)
- iOS uilabel自动换行
- 数据结构C语言利用堆栈表达式求值
- copy和mutableCopy
- 零崎的补番计划Ⅱ(0-1背包问题)
- APP字体大小,不随系统的字体大小变化而变化的方法
- hadoop 之eclipse插件定做
- Java 多线程:多线程产生的原因
- Codeforces Round #337 (Div. 2) 610C Harmony Analysis(脑洞)
- 回调机制
- 世界是数字的(一)