?? 對(duì)比.c
字號(hào):
#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;
}//構(gòu)造空棧(存儲(chǔ)整形)。
void initstack2(sqstack2 *s)
{
s->base=(char*)malloc(stackinitfir *sizeof(char));
if(s->base)
s->top=s->base;
s->stacksize=stackinitfir;
}//構(gòu)造空棧(存儲(chǔ)字符)。
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;
}//是運(yùn)算符則返回1,負(fù)責(zé)返回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];
}//判斷算符優(yōu)先級(jí)。
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;
}//計(jì)算a(c)b的值。
void evaluateexpression(sqstack2 *OPTR,sqstack1 *OPND)
{
char c,d,x,theta;
int a,b;
char str[10000];
printf("請(qǐng)輸入一個(gè)中綴表達(dá)式:\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("中綴法求值的結(jié)果為:\n");
printf("%d\n",gettop1(OPND));
}//中綴法求值。
/*void infixtopostfix(sqstack2 *OPTR,sqstack1 *OPND)
{
char c,x,theta;
printf("請(qǐng)輸入一個(gè)中綴表達(dá)式:\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");
}//將中綴法轉(zhuǎn)化為后綴法。
void evaluateexpression_postfix(sqstack2 *OPTR,sqstack1 *OPND)
{
int a,b;
char c;
printf("請(qǐng)輸入一個(gè)后綴表達(dá)式:\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("后綴法求值的結(jié)果為:\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);
}//主函數(shù)。
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -