#include<stdio.h>/*库文件包含*/
#include<string.h>/*用于字符串操作*/
#include<stdlib.h>/*用于exit函数*/
/**************************************************************************
int check(char *c)
输入参数:
char *c: 输入的字符串
返回参数:
0:字符串中有不符合规定的字符
1: 字符串字符符合规定,没有不符合规定的字符.
功能:
检查字符串中有否除了 0-9, +,-,*,/,(,),之外的其他字符,
如果有,则返回0, 表示出现错误。
若没有,则返回1,表式字符串符合规定。
**************************************************************************/
int check(char *c)
{
int k=0
while(*c!='\0')
{
if((*c>='0' &&*c<='9') || *c=='+' ||
*c=='-' || *c=='*' || *c=='/' ||
*c=='.' || *c=='(' || *c==')' )
{
}
else
{
printf("input error, there have the char not the math expression char!\n")
return 0
}
if(*c=='(')
k++
else if(*c==')')
k--
c++
}
if(k!=0)
{
printf("input error, there is not have correct bracket '()'!\n")
return 0
}
return 1
}
只是吐槽,不负法律责任。对于四则运算的处理应该属于 AST算法 的一个分支,如果不构建词法分析树的话,就难以对给定串(不一定是简单的四则运算)进行优先级处理。
然而居然能够说出“不用堆栈”之类的话,看样子楼主是基本不会什么数据结构了,即使这样,还奢望能够写出四则运算处理。。
然而语言略微有些偏激了。
简而言之,处理四则运算,考虑优先级规则最简单的方法是堆栈(不考虑优先级的话从左到右扫一遍也是可以的),如果要复杂的方法也行,只是连堆栈都不想用的人,估计理解不了那些复杂方法。
最后一提,如果可以使用数据结构(如栈啊,队列啊)的话,追问可以得到源代码,否则请勿回复,并建议主动关闭问题。
#include <stdio.h>#include "windows.h"
main()
{
char Exp[1024]={0},Oper[100]={0}
int Num[200]={0},Expi=0,Operi=0,Numi=0
boolean isnum=FALSE
printf("input a Expression:")
scanf("%s",Exp)
while(Exp[Expi]!='\0')
{
switch(Exp[Expi]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
Num[Numi]=Num[Numi]*10+Exp[Expi]-'0'
isnum=TRUE
break
}
case '+':
case '-':
{
if(isnum) //又录入一个新数据
{
Numi++
isnum=FALSE
}
while(Operi!=0&&Oper[Operi-1]!='(')
{
if(Operi<1||Numi<2)
{
printf("Expression is error!\n")
exit(0)
}
switch(Oper[Operi-1]) {
case '+':
Num[Numi-2]=Num[Numi-2]+Num[Numi-1]
Num[Numi-1]=0
Numi--
Oper[Operi-1]='\0'
Operi--
break
case '-':
Num[Numi-2]=Num[Numi-2]-Num[Numi-1]
Num[Numi-1]=0
Numi--
Oper[Operi-1]='\0'
Operi--
break
case '*':
Num[Numi-2]=Num[Numi-2]*Num[Numi-1]
Num[Numi-1]=0
Numi--
Oper[Operi-1]='\0'
Operi--
break
case '/':
Num[Numi-2]=Num[Numi-2]/Num[Numi-1]
Num[Numi-1]=0
Numi--
Oper[Operi-1]='\0'
Operi--
break
}
}
Oper[Operi]=Exp[Expi]
Operi++
break
}