算术表达式求值算法?用C语言版 编写一个表达式求值演算的 算法程序 要求:使用栈,需要将算法的过程显示出来 ,输入一连串
来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/08/18 16:11:09
算术表达式求值算法?
用C语言版 编写一个表达式求值演算的 算法程序
要求:使用栈,需要将算法的过程显示出来 ,输入一连串算术值 如:2*(3+2)# 然后 显示出算术过程 和结果!先将输入的中缀 转换后缀 再求值 程序中使用两个栈! 可以在VC++ 中运行
(高分 等!)
程序中要求定义运算符op的优先级.
表达式由键盘输入!
用C语言版 编写一个表达式求值演算的 算法程序
要求:使用栈,需要将算法的过程显示出来 ,输入一连串算术值 如:2*(3+2)# 然后 显示出算术过程 和结果!先将输入的中缀 转换后缀 再求值 程序中使用两个栈! 可以在VC++ 中运行
(高分 等!)
程序中要求定义运算符op的优先级.
表达式由键盘输入!
![算术表达式求值算法?用C语言版 编写一个表达式求值演算的 算法程序 要求:使用栈,需要将算法的过程显示出来 ,输入一连串](/uploads/image/z/3165779-11-9.jpg?t=%E7%AE%97%E6%9C%AF%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC%E7%AE%97%E6%B3%95%3F%E7%94%A8C%E8%AF%AD%E8%A8%80%E7%89%88+%E7%BC%96%E5%86%99%E4%B8%80%E4%B8%AA%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC%E6%BC%94%E7%AE%97%E7%9A%84+%E7%AE%97%E6%B3%95%E7%A8%8B%E5%BA%8F+%E8%A6%81%E6%B1%82%EF%BC%9A%E4%BD%BF%E7%94%A8%E6%A0%88%2C%E9%9C%80%E8%A6%81%E5%B0%86%E7%AE%97%E6%B3%95%E7%9A%84%E8%BF%87%E7%A8%8B%E6%98%BE%E7%A4%BA%E5%87%BA%E6%9D%A5+%2C%E8%BE%93%E5%85%A5%E4%B8%80%E8%BF%9E%E4%B8%B2)
#include
#include
#include
#include
#define DEBUG
#define NULL 0
#define ERROR -1
#define STACKSIZE 20
/* 定义字符类型栈 */
typedef struct{
char stackname[20];
char *base;
char *top;
} Stack;
/* ----------------- 全局变量--------------- */
Stack OPTR,OPND; /* 定义前个运算符栈,后个操作数栈 */
char expr[255] = ""; /* 存放表达式串 */
char *ptr = expr;
int step = 0; /* 计算的步次 */
int InitStack(Stack *s,char *name)
{
s->base=(char *)malloc(STACKSIZE*sizeof(char));
if(!s->base) exit (ERROR);
strcpy(s->stackname,name);
s->top=s->base;
return 1;
}
int In(char ch)
{
return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
void OutputStatus(void)
{
char *s;
/* step */
printf("\n%-8d",++step);
/* OPTR */
for(s = OPTR.base; s < OPTR.top; s++)
printf("%c",*s);
printf("\t");
/* OPND */
for(s = OPND.base; s < OPND.top; s++)
printf("%d ",*s);
/* input char */
printf("\t\t%c",*ptr);
}
int Push(Stack *s,char ch)
{
#ifdef DEBUG
char *name = s->stackname;
OutputStatus();
if(strcmp(name,"OPND") == 0)
printf("\tPUSH(%s,%d)",name,ch);
else
printf("\tPUSH(%s,%c)",name,ch);
#endif
*s->top=ch;
s->top++;
return 0;
}
char Pop(Stack *s)
{
char p;
#ifdef DEBUG
OutputStatus();
printf("\tPOP(%s)",s->stackname);
#endif
s->top--;
p=*s->top;
return (p);
}
char GetTop(Stack s)
{
char p=*(s.top-1);
return (p);
}
/* 判断运算符优先权,返回优行权高的 */
char Precede(char c1,char c2)
{
int i=0,j=0;
static char array[49]={ '>','>','','>','','>','>','>','','>',
'>','>','>','>','','>',
'','!','>','>',
'':
theta=Pop(&OPTR);
b=Pop(&OPND); a=Pop(&OPND);
Push(&OPND,Operate(a,theta,b));
break;
}
return GetTop(OPND);
}
int main(void)
{
/*
printf("Input the expression(end with \"#\" sign):");
do{
gets(expr);
}while(!*expr); */
//strcpy(expr,"2*(2+3)#");
char *pc;
printf("Input the expression(end with \"#\" sign):");
gets(expr);
pc=expr;
if(expr[0]=='\0')
{
printf("Please input a valid expression!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
else
{
while(*pc!='\0')
pc++;
pc--;
if(*pc!='#')
{
printf("Please asure the expression end with \"#\" sign!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
}
InitStack(&OPTR,"OPTR"); /* 初始化运算符栈 */
Push(&OPTR,'#'); /* 将#压入运算符栈 */
InitStack(&OPND,"OPND"); /* 初始化操作数栈 */
printf("\n\nresult:%d\n",EvalExpr());
system("pause");
return 0;
}
#include
#include
#include
#define DEBUG
#define NULL 0
#define ERROR -1
#define STACKSIZE 20
/* 定义字符类型栈 */
typedef struct{
char stackname[20];
char *base;
char *top;
} Stack;
/* ----------------- 全局变量--------------- */
Stack OPTR,OPND; /* 定义前个运算符栈,后个操作数栈 */
char expr[255] = ""; /* 存放表达式串 */
char *ptr = expr;
int step = 0; /* 计算的步次 */
int InitStack(Stack *s,char *name)
{
s->base=(char *)malloc(STACKSIZE*sizeof(char));
if(!s->base) exit (ERROR);
strcpy(s->stackname,name);
s->top=s->base;
return 1;
}
int In(char ch)
{
return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
void OutputStatus(void)
{
char *s;
/* step */
printf("\n%-8d",++step);
/* OPTR */
for(s = OPTR.base; s < OPTR.top; s++)
printf("%c",*s);
printf("\t");
/* OPND */
for(s = OPND.base; s < OPND.top; s++)
printf("%d ",*s);
/* input char */
printf("\t\t%c",*ptr);
}
int Push(Stack *s,char ch)
{
#ifdef DEBUG
char *name = s->stackname;
OutputStatus();
if(strcmp(name,"OPND") == 0)
printf("\tPUSH(%s,%d)",name,ch);
else
printf("\tPUSH(%s,%c)",name,ch);
#endif
*s->top=ch;
s->top++;
return 0;
}
char Pop(Stack *s)
{
char p;
#ifdef DEBUG
OutputStatus();
printf("\tPOP(%s)",s->stackname);
#endif
s->top--;
p=*s->top;
return (p);
}
char GetTop(Stack s)
{
char p=*(s.top-1);
return (p);
}
/* 判断运算符优先权,返回优行权高的 */
char Precede(char c1,char c2)
{
int i=0,j=0;
static char array[49]={ '>','>','','>','','>','>','>','','>',
'>','>','>','>','','>',
'','!','>','>',
'':
theta=Pop(&OPTR);
b=Pop(&OPND); a=Pop(&OPND);
Push(&OPND,Operate(a,theta,b));
break;
}
return GetTop(OPND);
}
int main(void)
{
/*
printf("Input the expression(end with \"#\" sign):");
do{
gets(expr);
}while(!*expr); */
//strcpy(expr,"2*(2+3)#");
char *pc;
printf("Input the expression(end with \"#\" sign):");
gets(expr);
pc=expr;
if(expr[0]=='\0')
{
printf("Please input a valid expression!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
else
{
while(*pc!='\0')
pc++;
pc--;
if(*pc!='#')
{
printf("Please asure the expression end with \"#\" sign!\n");
printf("Input the expression again(end with \"#\" sign):");
gets(expr);
}
}
InitStack(&OPTR,"OPTR"); /* 初始化运算符栈 */
Push(&OPTR,'#'); /* 将#压入运算符栈 */
InitStack(&OPND,"OPND"); /* 初始化操作数栈 */
printf("\n\nresult:%d\n",EvalExpr());
system("pause");
return 0;
}
算术表达式求值算法?用C语言版 编写一个表达式求值演算的 算法程序 要求:使用栈,需要将算法的过程显示出来 ,输入一连串
后缀表达式求值算法
算术表达式求值设计一个程序,利用栈实现算术表达式的求值要求:(1)以字符串形式输入语法正确算术表达式,参与运算的操作数为
C语言 从键盘输入一个简单的数学表达式,计算并显示该表达式的值 求算法和程序
编写一个判断算术表达式中开括号闭括号是否配对的算法
计算机算法求算术表达式的值,分哪两步实现算法?
完成一个 C算法,输入一算术表达式能够编程计算其中括号 “(”和“)”;“[”和“]”;“{”和“}”的匹配
我用C语言写一个关于算术表达式求值的程序.(用数据结构中的栈知识)
利用栈求表达式的值要求完成以下功能:编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值.
编写一个表达式中括号是否正确配对的算法
编写一个程序,可以计算算术表达式的值,对非法表达式要给出提示,并要求重新输入正确的表达式.(正确的表达式范例:123+4
栈和队列问题算法假设一个人算术表达式包含圆括弧、中括弧和花括弧三种类型的括弧,编写一个判别表达式中括弧是否正确匹配的算法