声明:这个程序可以计算+,-,*,/,负数,小数
负数用括号括起来例如(-1)
负数的计算过程:(-1) 转变为 (0-1) 哈哈~
分成六个点:
1.我的文件结构
2.顺序堆栈的头文件
3.头文件引入与自定义的常量和类型
4.主处理函数
5.测试的主函数
6.测试结果
1.我的文件结构
有两个文件 1.expCop.c 里面的内容是:头文件与自定义的常量和类型、主处理函数、测试的主函数
2.SqeStack.h 里面的内容是:栈的定义与处理函数
2.顺序堆栈的头文件
typedef struct{
DataType stack[MaxStackSize];
int top;
}SeqStack;
//栈初始化
void StackInitiate(SeqStack *S){
S->top = 0;
}
//判断栈是否为空
int StackNotEmpty(SeqStack S){
if(S.top==0){
return 0;
}
return 1;
}
//入栈
int StackPush(SeqStack *S,DataType x){
if(S->top>=MaxStackSize){
printf("堆栈已满无法插入!\n");
return 0;
}else{
S->stack[S->top]=x;
S->top++;
return 1;
}
}
//出栈
int StackPop(SeqStack *S,DataType *d){
if(S->top<=0){
printf("StackPop堆栈为空!\n");
return 0;
}else{
S->top--;
*d = S->stack[S->top];
return 1;
}
}
//获取栈顶数据元素
int StackTop(SeqStack S,DataType *d){
if(S.top<=0){
printf("StackTop堆栈为空!\n");
return 0;
}else{
*d = S.stack[S.top-1];
return 1;
}
}
3.头文件引入与自定义的常量和类型
typedef char DataType;//定义栈的数据存数的类型
#define MaxStackSize 100//定义栈的大小
#include //这个不用多说
#include //字符串处理(自带)
#include //用来处理小数,用到了pow(自带)
#include "SeqStack.h"//这是顺序堆栈的头文件(需要自己建立)
4.主处理函数
double expressionComputation(char *exp){
SeqStack myStack;//对操作符进行中缀到后缀
StackInitiate(&myStack);
double num[100];//保存操作数 注:在弹出操作符的以后要立刻取出num最后面两个数字进行运算后存回num中
int numSize = 0;
int i,j;
int spot = 0;
char c;
for(i=0;ii){
exp[k]=exp[k-1];
k--;
}
exp[i+1]='0';
}
}
if(exp[i]==')'){
while(StackTop(myStack,&c)&&c!='('){
StackPop(&myStack,&c);
switch(c){
case '*':num[numSize-2] = num[numSize-2]*num[numSize-1];
numSize--;
num[numSize]=0;
break;
case '/':num[numSize-2] = num[numSize-2]/num[numSize-1];
numSize--;
num[numSize]=0;
break;
case '+':num[numSize-2] = num[numSize-2]+num[numSize-1];
numSize--;
num[numSize]=0;
break;
case '-':num[numSize-2] = num[numSize-2]-num[numSize-1];
numSize--;
num[numSize]=0;
break;
}
}
StackPop(&myStack,&c);
}
}
while(StackNotEmpty(myStack)){
StackPop(&myStack,&c);
switch(c){
case '*':num[numSize-2] = num[numSize-2]*num[numSize-1];
numSize--;
num[numSize]=0;
break;
case '/':num[numSize-2] = num[numSize-2]/num[numSize-1];
numSize--;
num[numSize]=0;
break;
case '+':num[numSize-2] = num[numSize-2]+num[numSize-1];
numSize--;
num[numSize]=0;
break;
case '-':num[numSize-2] = num[numSize-2]-num[numSize-1];
numSize--;
num[numSize]=0;
break;
}
}
return num[0];//最后的值
}
5.测试的主函数
void main(void){
char exp[200]="";
printf("请输入一个表达式\t形如:2+3+(-5)+1.2\n");
scanf("%s",exp);
printf("\n结果为:%lf",expressionComputation(exp));
}
6.测试结果
可能会存在其他意想不到的错误,若测试出现其他错误请指正,我会加以修正。