📄 对比.c
字号:
#include<stdio.h>
#include<stdlib.h>
#define stackinitfir 100
typedef struct
{
int *base;
int *top;
int stacksize;
}sqstack1;//
typedef struct
{
char *base;
char *top;
int stacksize;
}sqstack2;//
void initstack1(sqstack1 *s)
{
s->base=(int*)malloc(stackinitfir *sizeof(int));
if(s->base)
s->top=s->base;
s->stacksize=stackinitfir;
}//构造空栈(存储整形)。
void initstack2(sqstack2 *s)
{
s->base=(char*)malloc(stackinitfir *sizeof(char));
if(s->base)
s->top=s->base;
s->stacksize=stackinitfir;
}//构造空栈(存储字符)。
void push1(sqstack1 *s,int e)
{
*(*s).top++=e;
}//插入整形元素e为栈顶元素。
void push2(sqstack2 *s,char e)
{
*(*s).top++=e;
}//插入字符元素e为栈顶元素。
int pop1(sqstack1 *s)
{
int e;
if((*s).top==(*s).base) return -1;
e=*--(*s).top;
return e;
}//删除栈顶整形元素并返回其值。
char pop2(sqstack2 *s)
{
int e;
if((*s).top==(*s).base) return -1;
e=*--(*s).top;
return e;
}//删除栈顶字符元素并返回其值。
int gettop1(sqstack1 *s)
{ int e;
if((*s).top==(*s).base) return -1;
e=*((*s).top-1);
return e;
}//用e返回栈顶整形元素。
char gettop2(sqstack2 *s)
{ char e;
if((*s).top==(*s).base) return -1;
e=*((*s).top-1);
return e;
}//用e返回栈顶字符元素。
int in(char c)
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='#')
return 1;
else
return 0;
}//是运算符则返回1,负责返回0.
char precede(char a,char b)
{
int i,j;
char str[9][9]={ ' ','+','-','*','/','(',')','#','^',
'+','>','>','<','<','<','>','>','<',
'-','>','>','<','<','<','>','>','<',
'*','>','>','>','>','<','>','>','<',
'/','>','>','>','>','<','>','>','<',
'(','<','<','<','<','<','=',' ','<',
')','>','>','>','>',' ','>','>','>',
'#','<','<','<','<','<',' ','=','<',
'^','>','>','>','>','<','>','>','>',
};
for(i=0;i<9;i++)
if(str[0][i]==b)
break;
for(j=0;j<9;j++)
if(str[j][0]==a)
break;
return str[j][i];
}//判断算符优先级。
int operate(int a,char c,int b)
{
int d=a;
d=0;
if(c=='+') d=a+b;
else if(c=='-') d=a-b;
else if(c=='*') d=a*b;
else d=a/b;
return d;
}//计算a(c)b的值。
void evaluateexpression(sqstack2 *OPTR,sqstack1 *OPND)
{
char c,d,x,theta;
int a,b;
char str[10000];
printf("请输入一个中缀表达式:\n");
initstack2(OPTR);
initstack1(OPND);
push2(OPTR,'#');
c=getchar();
while(c!='#'||gettop2(OPTR)!='#')
{
if(!in(c))
{
for(i=1;i<=10000;i++)
str[i]=c;t=str[i]
//push1(OPND,c-48);
c=getchar();
}
else
switch(precede(gettop2(OPTR),c))
{
case '<':
push2(OPTR,c);
c=getchar();
break;
case '=':
x=pop2(OPTR);
c=getchar();
break;
case '>':
theta=pop2(OPTR);
b=pop1(OPND);
a=pop1(OPND);
push1(OPND,operate(a,theta,b));
break;
}
}
printf("中缀法求值的结果为:\n");
printf("%d\n",gettop1(OPND));
}//中缀法求值。
/*void infixtopostfix(sqstack2 *OPTR,sqstack1 *OPND)
{
char c,x,theta;
printf("请输入一个中缀表达式:\n");
getchar();
initstack1(OPND);
initstack2(OPTR);
push2(OPTR,'#');
c=getchar();
while(c!='#'||(gettop2(OPTR)!='#'))
{
if(!in(c))
{
printf("%c",c);
push1(OPND,c);
c=getchar();
}
else switch(precede(gettop2(OPTR),c))
{
case '<': push2(OPTR,c);c=getchar();break;
case '=': x=pop2(OPTR);c=getchar();break;
case '>': theta=pop2(OPTR);printf("%c",theta);break;
}
}
printf("\n");
}//将中缀法转化为后缀法。
void evaluateexpression_postfix(sqstack2 *OPTR,sqstack1 *OPND)
{
int a,b;
char c;
printf("请输入一个后缀表达式:\n");
initstack1(OPND);
initstack2(OPTR);
push2(OPTR,'#');
c=getchar();
while(c!='#')
{
if(!in(c))
{
push1(OPND,c-48);
c=getchar();
}
else {
b=pop1(OPND);
a=pop1(OPND);
push1(OPND,operate(a,c,b));
c=getchar();
}
}
printf("后缀法求值的结果为:\n");
printf("%d\n",gettop1(OPND));
}//后缀法求值。*/
void main()
{
sqstack1 p,*OPND;
sqstack2 q,*OPTR;
OPND=&p;
OPTR=&q;
evaluateexpression(OPTR,OPND);
//infixtopostfix(OPTR,OPND);
//evaluateexpression_postfix(OPTR,OPND);
}//主函数。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -