以前写的程序
#include<stdioh>
#include<stringh>
#define MAX 200
typedef char datetype;
typedef struct Stack
{
datetype elem[MAX];
int top;
}S;//定义存放运算符的栈
typedef struct stack
{
int num[MAX];
int top;
}ss;//定义存放数字的栈
int degree(char member)
{
if(member==''||member=='/')
return 1;
if(member=='+'||member=='-')
return 0;
return -1;
}//返回运算符各自的优先级
int number(char ch)
{
if(ch>='0'&&ch<='9')
return 1;
return 0;
}//判断是否是数字
int prior(char member1,char member2)
{
return degree(member1)-degree(member2);
}//返回两个运算符那个优先
void Init(S s)
{
s->top=0;
}//初始化栈,即对top赋0。
int Full(S s)
{
if(s->top==MAX)
return 1;
return 0;
}//判断是否栈满
int Empty(S s)
{
if(s->top==0)
return 1;
return 0;
}//判断是否空栈
/入栈
1判断是否栈满
2未满则将元素入栈,top++
/
int Push(S s,datetype x)
{
if(Full(s))
return 0;
s->elem[s->top++]=x;
return 1;
}
int push(ss s,int x)
{
if(s->top==MAX)
return 0;
s->num[s->top++]=x;
return 1;
}
/出栈
1判断是否空栈
2非空则top--。
/
int Pop(S s)
{
if(Empty(s))
return 0;
s->top--;
return 1;
}
int pop(ss s)
{
if(s->top==0)
return 0;
s->top--;
return 1;
}
/获取栈顶元素
1判断是否空栈
2非空则返回栈顶元素。
/
datetype GetTop(S s)
{
if(Empty(s))
{
return 0;
}
return s->elem[s->top-1];
}
int gettop(ss s)
{
if(s->top==0)
return 0;
return s->num[s->top-1];
}
/
1判断得到的运算符是什么类型
2根据运算符来计算并返回结果。
/
int Count(int num1,int num2,char ch)
{
if(ch=='')
return num1num2;
if(ch=='/')
return num2/num1;
if(ch=='+')
return num1+num2;
if(ch=='-')
return num2-num1;
return 0;
}
/
1将所有'['和']'转化为'('和')'。(因为其效果一样)
2遇到(则入栈,遇到运算符若栈为空或栈顶元素为(则入栈,栈顶元素为其他运算符则按3的方法。
3两个运算符优先级相同或后者小于前者,则d出前者,并d出num最后两个元素进行运算得到结果入栈,否则入栈
4遇到)则不停d出运算符直至遇到一个(,同时运算得到结果入栈
/
int translate(char str[])
{
int ans=0,len,n,m;
int i;
S sign;
ss num;
numtop=0;
Init(&sign);
len=strlen(str);
printf("转化为后缀为 :");
for(i=0;i<len;i++)
{
if(str[i]=='[') str[i]='(';
if(str[i]==']') str[i]=')';
}
for(i=0;i<len;i++)
{
if(number(str[i]))
{
printf("%c",str[i]);
m=str[i]-'0';
if(i>0&&number(str[i-1]))
{
n=gettop(&num);
pop(&num);
push(&num,n10+m);
}
else
{
push(&num,m);
}
if(i<len-1&&!number(str[i+1]))
printf(" ");
}
else
{
int n1,n2,nn;
char ch;
if(str[i]=='(')
{
Push(&sign,str[i]);
}
else if(str[i]==')')
{
while(GetTop(&sign)!='(')
{
ch=GetTop(&sign);
n1=gettop(&num);
pop(&num);
n2=gettop(&num);
pop(&num);
nn=Count(n1,n2,ch);
push(&num,nn);
printf("%c ",ch);
Pop(&sign);
}
Pop(&sign);
}
else
{
if(!Empty(&sign)||GetTop(&sign)=='(')
{
char ch1=str[i];
int h;
while(!Empty(&sign)||GetTop(&sign)=='(')
{
char ch=GetTop(&sign);
h=prior(ch1,ch);
if(h==1)
{
Push(&sign,ch1);
break;
}
if(h==0||h==-1)
{
int n1,n2;
n1=gettop(&num);
pop(&num);
n2=gettop(&num);
pop(&num);
nn=Count(n1,n2,ch);
push(&num,nn);
printf("%c ",ch);
Pop(&sign);
}
}
if(h!=1) Push(&sign,ch1);
}
else
{
Push(&sign,str[i]);
}
}
}
}
while(!Empty(&sign))
{
char ch=GetTop(&sign);
int n1,n2,nn;
n1=gettop(&num);
pop(&num);
n2=gettop(&num);
pop(&num);
nn=Count(n1,n2,ch);
push(&num,nn);
printf("%c ",ch);
Pop(&sign);
}
printf("\n");
ans=gettop(&num);
return ans;
}
/匹配检查
1遇到(,[入栈。
2遇到],检查栈顶是否为[,遇到),检查栈顶是否为(
3结束后看是否栈为空或(与)、[与]个数是否相等。
/
int right(char str[])
{
int i,len,n1=0,n2=0,m1=0,m2=0;
S s;
Init(&s);
len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]=='(')
{
Push(&s,str[i]);
n1++;
}
if(str[i]=='[')
{
Push(&s,str[i]);
m1++;
}
if(str[i]==')')
{
if(GetTop(&s)!='(')
return 0;
Pop(&s);
n2++;
}
if(str[i]==']')
{
if(GetTop(&s)!='[')
return 0;
Pop(&s);
m2++;
}
}
if(n1!=n2||m1!=m2) return 0;
return 1;
}
int main()
{
char str[MAX]={"3[2+2(1+5)]-210+4"};
printf("举例如下:\n计算3[2+2(1+5)]-210+4\n");
printf("计算结果为%d\n",translate(str));
while(gets(str))
{
int ans;
if(!right(str))
{
printf("输入有误!\n");
continue;
}
ans=translate(str);
printf("计算结果为%d\n",ans);
}
return 0;
}
var s:ansistring;
begin
readln(s);
p:=1;pp:=0;
while p<>0 do begin
p:=pos('(',s);
pp:=pos(')',s);
求出括号里的值,在s中删去原串,代入值;
while p·····
找到乘号除号
求出值再代入;
for i:=1 to length(s) do
再求加减
writeln(t);
end
写的较为粗糙
//不能算负数 输入的话像这样 1+2(3+4)然后回车
#include<stdioh>
#include<stringh>
char s3[10][10];
static int x=0;
int f(char s, char s1[10][10])
{
int a, i, k;
char p;
p = s;
i=0; k=0;
while(p)
{
if(p>='0'&&p<='9')
if(i==0) { a=atoi(p); itoa(a, &s1[k++][0], 10); i=1;}
else;
else { i=0; s1[k][0]=p; s1[k][1]=0; k++;}
p++;
}
return k;
}
int c(char s)
{
switch(s)
{
case '-':
case '+': return 2;
case '':
case '/': return 3;
case ')':
case '(': return 1;
default : return 0;
}
}
int t(char s, int a, int b)
{
if(s=='+') return a+b;
if(s=='-') return a-b;
if(s=='') return ab;
if(s=='/') return a/b;
}
void o(char s1[10], char s, int n)
{
static int i, j;
int k;
if(s=='(') {i++; s1[i]='('; return;}
if(s==')') { do { s3[x][0]=s1[i]; s3[x][1]=0; x++; i--;} while(s1[i]!='('); i--; return ;}
if(n==0&&i>=0) do { s3[x][0]=s1[i]; s3[x][1]=0; x++;i--;} while(i!=-1);
if(i==0&&s1[0]==0) { s1[0] = s;}
else if(c(s)>=c(s1[i])) s1[++i]=s;
else { do { s3[x][0]=s1[i]; s3[x][1]=0; x++;if(i==0) { i--; break;} i--;} while(c(s1[i])>c(s)); i++; s1[i]=s;}
}
void main()
{
char s1[100];
char s[10][10];
char s2[10];
int s4[10];
char s5[10];
int k, i, a, l;
int u=0;
int p, q;
gets(s1);
k=f(s1, s);
s2[0]=0;
for(i=0; i<k; i++)
{
if(c(s[i][0])==0) { strcpy(&s3[x][0], &s[i][0]); x++;}
else
{
o(&s2[0], s[i][0],1);
}
}
o(s2, s[i][0],0);
for(i=0; i<k; i++) printf("%s ", &s3[i][0]);
for(i=0, l=0, u=0; i<k; i++)
{
if(s3[i][0]>='0'&&s3[i][0]<='9')
{
s4[i] = atoi(&s3[i][0]);
}
}
printf("\n");
printf("\n开始计算\n");
for(i=0; i<k; i++)
{
if(c(s3[i][0])==3||c(s3[i][0])==2)
{
p=i;
while(s3[p][0]<'0'||s3[p][0]>'9') p--;
q=p-1;
while(s3[q][0]<'0'||s3[q][0]>'9') q--;
s3[p][0]='z';
printf("\n%d %c %d = ", s4[q], s3[i][0] , s4[p] );
s4[q]=t(s3[i][0], s4[q], s4[p]);
printf("%d\n", s4[q]);
}
}
printf("\n结果=%d\n", s4[0]);
}
以上就是关于c语言 编写程序 计算一个中缀表达式的值 式中只出现+ - * \ (、)等运算符全部的内容,包括:c语言 编写程序 计算一个中缀表达式的值 式中只出现+ - * \ (、)等运算符、求中缀表达式直接求值(不转换为后缀)P代码,表达式含括号,风格贴近pascal语言的伪代码也可、中缀表达式求值问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)