| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 798 人关注过本帖
标题:混合四则运算
只看楼主 加入收藏
guokeafl
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-11-19
收藏
 问题点数:0 回复次数:1 
混合四则运算
如果用C语言数据结构编一个程序
实现:在屏幕上输入一个表达式,然后得出表达式的值。
用双栈做
搜索更多相关主题的帖子: 运算 屏幕 数据结构 C语言 
2006-11-20 20:03
菜鸟上路
Rank: 4
等 级:贵宾
威 望:14
帖 子:1120
专家分:0
注 册:2006-3-21
收藏
得分:0 

/* 本程序可用于多位操作符的运算
字符型的函数和结构体名后面都加1
整型的函数和结构体名后面都加2 */

#include "Stdio.h"
#include "Conio.h"
#include "math.h"

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

struct Stack1
{ /*字符类结构体*/
char *base;
char *top;
int stacksize;
};

struct Stack2
{ /*整形结构体*/
int *base;
int *top;
int stacksize;
};

InitStack1(struct Stack1 *S)
{ /*构造一个空栈*/
S->base=(char *)malloc(STACK_INIT_SIZE * sizeof(char));

if (!S->base) printf("Application is failed!");
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}

InitStack2(struct Stack2 *S)
{ /*构造一个空栈*/
S->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));

if (!S->base) printf("Application is failed!");
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
}

char GetTop1(struct Stack1 S)
{ /*若栈不空,则返回栈顶元素*/
if (S.top==S.base) return 0;

return(*(S.top-1));

}

int GetTop2(struct Stack2 S)
{ /*若栈不空,则返回栈顶元素*/
if (S.top==S.base) return 0;

return(*(S.top-1));

}

Push1(struct Stack1 *S,char e)
{ /*插入新的栈顶元素*/
if ( (S->top-S->base)>=(S->stacksize) )
{
S->base=(char *)realloc(S->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));
if (!S->base) return 0;
S->top=S->base+S->stacksize;
}

*S->top++=e;
}

Push2(struct Stack2 *S,int e)
{ /*插入新的栈顶元素*/
if ( (S->top-S->base)>=(S->stacksize) )
{
S->base=(int *)realloc(S->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(int));
if (!S->base) return 0;
S->top=S->base+S->stacksize;
}

*S->top++=e;
}

char Pop1(struct Stack1 *S)
{ /*若栈不空,则删除S栈顶元素,并返回其值*/
if (S->top==S->base) return 0;

return (*(--S->top));
}

int Pop2(struct Stack2 *S)
{ /*若栈不空,则删除S栈顶元素,并返回其值*/
if (S->top==S->base) return 0;

return (*(--S->top));
}

int Compare(char e)
{ /*比较字符是运算符还是操作数*/
if (e>='0' && e<='9')
return 0;
return 1;
}

char Precede(char e1,char e2)
{
int i=0,j=0;
char save[]={ '+', '-', '*', '/', '(', ')', '#'};
char index[][7]={
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=','$'},
{'>','>','>','>','$','>','>'},
{'<','<','<','<','<','$','='}
};
for (i=0;i<7;i++)
{
if (save[i]==e1)
break;
}
for (j=0;j<7;j++)
{
if (save[j]==e2)
break;
}
return index[i][j];
}
int Operate(int operand2,char operate,int operand1)
{

switch (operate)
{
case '+':
return (operand1+operand2);
case '-':
return (operand1-operand2);
case '*':
return (operand1*operand2);
case '/':
return (operand1/operand2);
}
}

int change(int elem,int j)
{
int i=0,response=1;
for (i=0;i<=j;i++)
{
response*=elem;
}
return response;
}

int Ret(int e)
{
int i=1,temp=1;
if (e>=1)
{
for (i=1;i<=e;i++)
temp=temp*10;
return temp/10;
}
else
return 0;
}

int ret(int e1,int e2)
{
return Ret(e1-e2);
}

int EvaluateExpression(char in[])
{ /*算术表达式求值的算符优先比较,OP为运算符集合*/
int i=1,j=1,count=0,flag;
char temp,*ch=in;
int temp1,temp2,temp3=0;
struct Stack1 S1;
struct Stack2 S2;
InitStack1(&S1); /*S1存放运算符*/
InitStack2(&S2); /*S2存放一位操作数*/
Push1(&S1,*ch);
while ( *(ch+i)!='\0' && S1.base!=S1.top )
{

if (!Compare(*(ch+i)))
{
temp3=0;
while (!Compare(*(ch+i)))
{
Push2(&S2,(*(ch+i)-48));
count++;
i++;
}
i--;
flag=count+1;
while (count>0)
{
temp3=temp3+Pop2(&S2)*ret(flag,count);
count--;
}
count=0;
Push2(&S2,temp3);
}
else
{
switch (Precede(GetTop1(S1),*(ch+i)))
{
case '<':
Push1(&S1,*(ch+i));
break;
case '=':
Pop1(&S1);
break;
case '>':
temp=Pop1(&S1);
temp1=Pop2(&S2);
temp2=Pop2(&S2);
Push2(&S2,Operate(temp1,temp,temp2));
i--;
break;
}
}
i++;
}
return GetTop2(S2);
}

int main(void)
{
int i=1;
char ch[]="#12+121-(36/3+1*2)+5*1#";

printf("\nThe expression is: ");
for (i=1;i<sizeof(ch)-2;i++)
printf("%c ",ch[i]);
printf("\n\nThe answer is: ");
printf("%d",EvaluateExpression(ch));
getch();
getch();
return 0;
}
稍微改下,自己输入表达式就可以了


2006-11-20 21:16
快速回复:混合四则运算
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.070795 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved