计算c语言表达式的值,如何用C语言计算表达式的值,栈的经典应用

这篇博客介绍了如何利用顺序堆栈来实现中缀表达式到后缀表达式的计算,包括了程序的文件结构、栈的操作函数、主处理函数的详细步骤以及测试主函数和示例测试结果。该程序能处理加减乘除、负数和小数,小数需用括号括起。
摘要由CSDN通过智能技术生成

声明:这个程序可以计算+,-,*,/,负数,小数

负数用括号括起来例如(-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.测试结果

4afbe1bc5a026fa927c486aefa67db88.png

可能会存在其他意想不到的错误,若测试出现其他错误请指正,我会加以修正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值