#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); //调用
}
温馨提示:内容为网友见解,仅供参考
谁能用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语言程序如下(见图)