谁能用C语言编个完整的程序求表达式的值,例如3*(7-2)。很急!!!谢谢了

要用栈的方法来实现求值。谢谢了

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0

#define LEN 10//输入数字不得超过10位
#define MAXSIZE 40//数字和运算符总个数不得超过40个

typedef struct
{

char data[MAXSIZE][LEN];//栈区为二维数组
int top;

}seqstack;

seqstack *initseqstack();
void push(seqstack *s, char *x);
char *pop(seqstack *s);
int optr(char *z);
int priority(char *a, char *b);
void process(char arrOne[][LEN], char arrTwo[][LEN]);
double calc(char *a, char *b, char *ch);
void express(char (*arrTwo)[LEN]);

seqstack *s = NULL;//声明全局变量

seqstack *initseqstack()//初始化栈顶指针
{
seqstack *s = (seqstack *) malloc (sizeof(seqstack));

s->top = -1;

return s;
}

void push(seqstack *s, char *x)//入栈
{
if (MAXSIZE-1 == s->top)
{
printf("overflow\n");
exit(0);
}

strcpy(s->data[++s->top], x);
}

char *pop(seqstack *s)//出栈
{
char *y = (char *) malloc (LEN * sizeof(char));
strcpy(y, s->data[s->top--]);
return y;
}

int optr(char *z)//判断是否为运算符,是返回TRUE
{
int i;
char *optr1[6] = {"+", "-", "*", "/", "(", ")"};

for (i=0; i<6; i++)
{
if (0 == strcmp(optr1[i], z))
{
return TRUE;
}
}
return FALSE;
}

int priority(char *a, char *b)//比较优先级
{
int i, j;
char *array[5] = {"(", "+", "-", "*", "/"};//优先级列表,由小到大

for (i=0; i<5; i++)
{
if (0 == strcmp(array[i], a))
{
break;
}
}
for (j=0; j<5; j++)
{
if (0 == strcmp(array[j], b))
{
break;
}
}

switch (i)
{
case 0: i = 0; break;
case 1:
case 2: i = 1; break;
case 3:
case 4: i = 2; break;
}

switch (j)
{
case 0: j = 0; break;
case 1:
case 2: j = 1; break;
case 3:
case 4: j = 2; break;
}

if (i >= j)
{
return TRUE;
}
else
{
return FALSE;
}
}

void process(char (*arrOne)[LEN], char (*arrTwo)[LEN])//将中缀式处理成后缀式(运算符入栈处理)
{
int i, j = 0;

s = initseqstack();//初始化

for (i=0; 0!=strcmp(arrOne[i], "\0"); i++)
{
if (1 < strlen(arrOne[i]) || (TRUE != optr(arrOne[i])))//arrOne[i][LEN]为数字时
{
strcpy(arrTwo[j++], arrOne[i]);//将数字拷贝到arrTwo
}
else if (0 == strcmp(arrOne[i], "("))
{
push(s, arrOne[i]);//入栈
}
else if (0 == strcmp(arrOne[i], ")"))
{
while ((-1 != s->top) && (0 != strcmp(s->data[s->top], "(")))
{
strcpy(arrTwo[j++], pop(s));//出栈
}
pop(s);//将"("弹出
}
else//此时arrOne的内容只可能是"+", "-", "*", "/"
{
if (-1 == s->top)
{
push(s, arrOne[i]);
}
else
{
while (-1 != s->top)
{
if (TRUE == priority(s->data[s->top], arrOne[i]))//与栈顶元素进行优先级比较
{
strcpy(arrTwo[j++], pop(s));
}
else
{
push(s, arrOne[i]);
break;
}
}
if (-1 == s->top)
{
push(s, arrOne[i]);
}
}
}
}

while (-1 != s->top)
{
strcpy(arrTwo[j++], pop(s));
}
}

double calc(char *a, char *b, char *ch)//运算,返回double类型
{
double num;
double numOne, numTwo;

numOne = atof(a);
numTwo = atof(b);//将字符串转化为double类型(atof是库函数)

switch(*ch)
{
case '+': num = numOne + numTwo; break;
case '-': num = numOne - numTwo; break;
case '*': num = numOne * numTwo; break;
case '/':
if ((0.000001 >= numTwo) && (-0.000001 <= numTwo))
{
printf("error!\n");
}
else
{
num = numOne / numTwo;
}
break;
default:
exit(0);
}

return num;
}

void express(char (*arrTwo)[LEN])//后缀式入栈运算
{
int i;
double num;

char result[LEN];
char numOne[LEN], numTwo[LEN];

s = initseqstack();//初始化

for (i=0; 0!=strcmp(arrTwo[i], "\0"); i++)
{
if (TRUE != optr(arrTwo[i]))//假如是数,则入栈
{
push(s, arrTwo[i]);
}
else
{
strcpy(numTwo, pop(s));
strcpy(numOne, pop(s));//将顶上两数字弹出

num = calc(numOne, numTwo, arrTwo[i]);//运算
gcvt(num, LEN, result);//将double转换成字符串(gcvt是库函数)

push(s, result);//入栈
}
}

printf(" %s\n\n", result);//输出最终结果
}

void Menu(void)
{
printf("注意:\n");
printf("1.本程序有一定误差,误差范围大约是-0.001到+0.001\n");
printf("2.本程序只能处理正确的表达形式.\n");
printf("3.避免计算结果越界.\n");
printf("4.输入方式:如输入表达式(-1+2)*3\n");
printf(" 输入:\n");
printf(" (空格-1空格+空格2空格)空格*空格3空格=回车\n");
}

void main(void)
{
int i = 0;

char arr[MAXSIZE][LEN]; //输入字符串
char arrOne[MAXSIZE][LEN] = { "\0" }; //保存中缀式
char arrTwo[MAXSIZE][LEN] = { "\0" }; //保存后缀式

Menu();

printf("\n\n\n请输入表达式:\n");

while (scanf("%s", arr[i]))
{
if (0 == strcmp(arr[i], "="))
{
break;
}
strcpy(arrOne[i], arr[i]);
i++;
}
process(arrOne, arrTwo); //调用
express(arrTwo); //调用
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-09-28
#include<stdio.h>
void main()
{
printf("%d\n",3*(7-2));
}追问

要用栈的方法来实现求值。谢谢了

追答

不好意思,我没看到。

第2个回答  2011-09-28
#include"stdio.h"
void main()
{int a=3,b=7,c=2;
int d;
d=3*(7-2);
printf("%d\n",d);
}追问

要用栈的方法来实现求值。谢谢了

第3个回答  2011-09-28
#include<stdio.h>
main()
{
int x;//define a variable;
x=3*(7-2);//Expression
printf("x=%d\n",x);//output
return;
}追问

要用栈的方法来实现求值。谢谢了

第4个回答  2011-09-28
我不需要你给分,你可以看下这个资料就行了
表达式运算,我空间里。
中缀转后缀
http://hi.baidu.com/ccocwwh/blog/item/875af00252c529ff08fa938e.html

参考资料:http://hi.baidu.com/ccocwwh/blog/item/875af00252c529ff08fa938e.html

谁能用C语言编个完整的程序求表达式的值,例如3*(7-2)。很急...
case 3:case 4: i = 2; break;

C语言计算表达式的值
void translate(char str[],char exp[]) \/*将算术表达式转换成后缀表达式*\/ { struct { char data[MaxSize];int top; \/*top为栈顶*\/ }op; \/*定义一个含data和top的结构体*\/ char ch;int i = 0,t = 0;op.top = -1;ch = str[i]; \/*将str的每一个数转换成ch*\/...

c语言 计算分段函数,测试数据分别是-2,3,7
f(x,y)=2X2+3x+1\/(1+y2)(x>=0,y<=0)f(x,y)=3sin(x+y)\/ 2X2+3X+1 (x<0)

数据结构c语言版表达式求值标准程序
link head; \/\/ 指向栈顶第一个有效对象

C语言编程,拜托会的可以给点提示,或写下给我看看
int IsOperand(char c) \/\/判断字符是否为操作数的部分;{ if((c<='9'&&c>='0')||c=='.')return 1;return 0;} void ReadData(char str[100][100]) \/\/此函数将运算符优先级表从文件中读入到数组str中;{ FILE *fp;int i;if((fp=fopen("E:\\\\precede.txt","r"))==NULL...

用C语言编写:编写一个函数,要求在主函数中输入两个数,输出其中最大值...
C语言代码如下:include<stdio.h> int main(){ int a,b;printf("please enter two number:"); ---两个数字用空格隔开,以回车键结束输入。scanf("%d %d",&a,&b);if(a>b)printf("The max is %d",a);else if(b>a)printf("The max is %d",b);else printf("The two Numbers...

C语言大作业,C语言高手们救下小弟啊```
程序要求:(1)能够完成300人以内任何人数的成绩处理。(2)程序要有主控菜单 \/ include<stdio.h> include<stdlib.h> include<string.h> struct stud { long num;char name[20];double score;};typedef struct stucode { struct stud student ;struct stucode *next;}L;void menu();void ...

用C语言写一个小程序(一个小功能就可以了),要求:100行代码左右,不要太...
一定要用C语言写哦,100行代码,一个小功能就可以(也不要太简单,上次写了个打印图形什么,被老师骂死了,5555),因为期末课程设计,不能和其他同学相同,尽量自己写一个好吗,谢谢... 一定要用C语言写哦,100行代码,一个小功能就可以(也不要太简单,上次写了个打印图形什么,被老师骂死了,5555),因为期末课程设计,...

急!!!求一个简单的C语言计算器程序...
case 7:factor();getch();break;case 8: exit(0);break;} } } \/\/以下是自己定义的函数 void menu()\/\/菜单 { printf("+===my counter===+\\n");printf("+功能如下: +\\n");printf("+ 1.加法 +\\n");printf("+ 2.减法 +\\n");printf("+ 3.乘法 +\\n"...

一个c语言小问题,编写程序?
按照题目要求编写的C语言程序如下(见图)

相似回答