📄 a.c
字号:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define NUMBER_LENGTH 1000
typedef int number[NUMBER_LENGTH];
typedef struct stack
{
number num;
int top;
}STACK;
void INPUT_EXPRESSION(STACK *S1,STACK *S2,int *sign);
STACK *STACK_CREATE_INIT();
STACK *ADD_OPERATION(STACK *S1,STACK *S2);
void SHOW_RESULT(STACK *R);
STACK *MINUS_OPERATION(STACK *S1,STACK *S2);
STACK *MINUS_OPERATION(STACK *S1,STACK *S2)//减法操作
{
STACK *R,*temp;
int i,length,flag,l1,l2;
l1=l2=0;
flag=0;
R=STACK_CREATE_INIT();
if(S1->top > S2->top){length=S1->top +1;flag=1;}
if(S1->top == S2->top)
{
length=S1->top +1;
while(l1!=S1->top+1 && l2!=S2->top+1)
if(S1->num[l1++]>=S2->num[l2++])flag=1;
else {flag=0;break;}
}
else length=S2->top +1;
if(flag==0)//如果S2比S1大,交换
{
temp=S1;
S1=S2;
S2=temp;
temp=NULL;
}
for(i=0;i<length;i++)//各位相减
{
if(S1->top!=-1 && S2->top!=-1)R->num[R->top++]=S1->num[S1->top--]-S2->num[S2->top--];
else if(S1->top!=-1 && S2->top==-1)R->num[R->top++]=S1->num[S1->top--];
else if(S2->top!=-1 && S1->top==-1)R->num[R->top++]=0-S2->num[S2->top--];
}
for(R->top=0;R->top<length;R->top++)//借位处理
{
if(R->num[R->top]<0)
{
R->num[R->top]+=10;
R->num[R->top+1]--;
}
}
R->top--;
while(R->num[R->top]==0)R->top--;
if(flag==0)R->num[R->top]*=-1;//如果S1,S2交换过,还要对最高位取反
return(R);
}
void SHOW_RESULT(STACK *R)//显示最终答案
{
while(R->top!=-1)
{
printf("%d",R->num[R->top--]);
}
}
STACK *ADD_OPERATION(STACK *S1,STACK *S2)//加法操作
{
STACK *R;
int i,length;
R=STACK_CREATE_INIT();
if(S1->top > S2->top)length=S1->top+1;
else length=S2->top+1;
for(i=0;i<length;i++)//各位相加
{
if(S1->top!=-1 && S2->top!=-1)R->num[R->top++]=S1->num[S1->top--]+S2->num[S2->top--];
else if(S1->top!=-1 && S2->top==-1)R->num[R->top++]=S1->num[S1->top--];
else if(S2->top!=-1 && S1->top==-1)R->num[R->top++]=S2->num[S2->top--];
}
for(R->top=0;R->top<length-1;R->top++)//进位处理,事实上最高位没有被处理,但不影响输出结果
{
if(R->num[R->top]>=10)
{
R->num[R->top]-=10;
R->num[R->top+1]++;
}
}
return(R);
}
STACK *STACK_CREATE_INIT()//栈的建立和初始化
{
STACK *S;
S=(STACK *)malloc(sizeof(STACK));
S->top=0;
return(S);
}
void INPUT_EXPRESSION(STACK *S1,STACK *S2,int *sign)//输入表达式
{
int status;
char ch;
status=0;
while(ch=getchar())
{
if(status==0)//输入第一个数字和运算符
{
if(ch>='0' && ch<='9')S1->num[S1->top++]=ch-'0';
else
{
//第一个数字输入结束
if(ch=='+'){S1->top--;*sign=0;status=1;}
if(ch=='-'){S1->top--;*sign=1;status=1;}
}
continue;
}
if(status==1)//输入第二个数字
{
if(ch>='0' && ch<='9')S2->num[S2->top++]=ch-'0';
else
{
S2->top--;//第二个数字输入结束
break;
}
if(ch=='\n')break;
}
}
}
main()
{
STACK *S1,*S2,*R;
int sign=0;//运算符标记
S1=STACK_CREATE_INIT();
S2=STACK_CREATE_INIT();
printf("输入表达式:");
INPUT_EXPRESSION(S1,S2,&sign);
if(sign==0)R=ADD_OPERATION(S1,S2);
if(sign==1)R=MINUS_OPERATION(S1,S2);
printf("\n结果是:");
SHOW_RESULT(R);
printf("\n");
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -