#include <stdlib.h>
#include <string.h>
#define MAXSIZE 4000
typedef struct
{
char data[10]
int top//头地址
int base//基地址
int length//长度
}Stack
void init(Stack *st)//初始化栈
{
st->base=0
st->top=0
st->length=0
}
int isEmpty(Stack *st)
{
int n=0,top,base
top =st->top
base =st->base
if(top==base)
{
return 1
}
return n
}
int isFull(Stack *st)
{
int n=0,top,base
top =st->top
if(top>=4000)
{
return 1
}
return n
}
char getTop(Stack *st)// 返回top值,不改变栈的结构
{
char n
if(isEmpty(st))
{
printf("栈为空\n")
return 0
}
int positon= st->top-1
n= st->data[positon]//取出数据
return n
}
char pop(Stack *st)// 出栈,返回
{
char n
if(isEmpty(st))
{
printf("栈为空\n")
return 0
}
int positon= st->top-1
n= st->data[positon]//取出数据
st->top--
st->length--
st->data[positon]='\0'//消除数据
return n
}
void push(char n,Stack *st)//入栈
{
int positon
if(isFull(st))
{
printf("栈满\n")
}
else
{
positon= st->top//获取位置
st->data[positon]=n//存入数据
st->top++//改变位置
}
}
void show(Stack *m1)//输出栈中的数据
{
int top,base
top=m1->top
base=m1->base
while(top>base)
{
printf("%c,",m1->data[--top])
}
printf("\n")
}
int isOperate(char temp)//是否是操作符
{
if(temp=='+'||temp=='-'||temp=='*'||temp=='/'||temp=='('||temp==')'||temp=='#')
{
return 1
}
return 0
}
int isValue(char temp)//是否是数值
{
if(temp>='0'&&temp<='9')//
{
return 1
}
else
{
return 0
}
}
int isAvail(char temp)//是否有效字符
{
if(isOperate(temp)||isValue(temp))//如果temp既不是操作符和数值的话,则它是非法的
{
return 1
}
return 0
}
int detect(char temp)//搜索矩阵位置
{
int i=0
char oper[7]={'+','-','*','/','(',')','#'}
for(i=0i<7i++)
{
if(temp==oper[i])
{
return i
}
}
}
char Priority(char temp,char optr)//判断优先级
{
/**//*
+ - * / ( ) #
1 2 3 4 5 6 7
+ 1 <<<<>>>
- 2 <<<<>>>
* 3 >><<>>>
/ 4 >><<>>>
( 5 >>>>>= 0
) 6 <<<<= 0 >
# 7 <<<<>0 =
*/
int row ,col
char priority[7][7]={/**//* + - * / ( ) # */
{'<','<','<','<','>','>','>'},
{'<','<','<','<','>','>','>'},
{'>','>','<','<','>','>','>'},
{'>','>','<','<','>','>','>'},
{'>','>','>','>','>','=','>'},
{'<','<','<','<','=','0','>'},
{'<','<','<','<','>','<','='},
}
row = detect(temp)//找出对应的矩阵下标
col = detect(optr)
// printf("%d,%d",row,col)
//优先级存储在一个7x7的矩阵中,对应关系上图;
return priority[row][col]
}
char evaluate(int a,int b,char oper)
{
switch(oper)
{
case '+': return a+b+'0'
case '-': return a-b+'0'
case '*': return a*b+'0'
case '/': return a/b+'0'
default : return 0+'0'
}
}
int calculateExpress(char *express)//计算表达式
{
int result=0
int a,b
// char oper,result
Stack OPTR,OPND//OPTR存储操作符,OPND操作数值
init(&OPTR)
init(&OPND)
push('#',&OPTR)//默认第一个位'#'
////////////////////-算法-////////////////////////////
while(*express!='\0')
{
char temp
temp= *(express)
printf("---------------------------------\n")
printf("当前的符号为%c\n",temp)
if(isAvail(temp))//是否是有效字符
{
if(isOperate(temp) )//输入的是操作符
{
char oper,result
char optr = getTop(&OPTR)//栈中top位的操作符
printf("栈顶操作符位:%c\n",optr)
char prior = Priority(temp,optr)//判断优先级
switch(prior)
{
case '>':
push(temp,&OPTR)
printf("将符号位%c入栈\n",temp)
express++
break
case '<':
//int a,b
//char oper,result
a=pop(&OPND)-'0'//存在栈中的都是char字符
b=pop(&OPND)-'0'
oper=pop(&OPTR)
result=evaluate(b,a,oper)//出栈一个操作符,计算结果
//printf("%d",result-'0')
push(result,&OPND)//结果入OPND
printf("%d%c%d结果为:%d\n",b,oper,a,result-'0')
break
case '=':
//消除括号
pop(&OPTR)
printf("消除括号\n")
express++
break
}
}
if(isValue(temp))//输入的是数值
{
push(temp,&OPND)//将数值位入栈
express++
printf("将数值%c压入栈\n",temp)
//show(&OPND)
}
}
else //表达式中有非法字符
{
printf("表达式中有非法字符\n")
exit(-1)//退出程序
}
}
// show(&OPND)
// show(&OPTR)
return getTop(&OPND)-'0'
}
void inputExpress(char *express)//输入表达式
{
int length=0
printf("请输入一个表达式:")
scanf("%s",express)
int len =strlen(express)
express[len]='#'//表达式最后一位默认为'#'
express[len+1]='\0'
}
void output(char *express,int result)//输出表达式
{
int i=0
printf("----------------------------------------\n表达式:")
while(express[i]!='#')
{
printf("%c",express[i])
i++
}
printf("=%d\n",result)
}
int main()
{
char express[100]//表达式
int result =0
inputExpress(express)//输入表达式
result = calculateExpress(express)//计算表达式;
output(express,result)//输出表达式
//、、、、、、、、、、、、、测试优先级。
/**//*
char m='7'
m=Priority('+','*')
printf("优先级为%c",m)
int m=evaluate(5,6,'m')
printf("%d",m)
*/
return 0
}
下面是使用 C 语言设计简易科学计算器的示例代码:#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
char op
double num1, num2
printf("请输入数学表达式(如:1 + 2):")
scanf("%lf %c %lf", &num1, &op, &num2)
switch (op)
{
case '+':
printf("结果为:%.2lf\n", num1 + num2)
break
case '-':
printf("结果为:%.2lf\n", num1 - num2)
break
case '*':
printf("结果为:%.2lf\n", num1 * num2)
break
case '/':
if (num2 == 0)
{
printf("除数不能为 0!\n")
}
else
{
printf("结果为:%.2lf\n", num1 / num2)
}
break
case '^':
printf("结果为:%.2lf\n", pow(num1, num2))
break
case 's':
printf("结果为:%.2lf\n", sin(num1))
break
case 'c':
printf("结果为:%.2lf\n", cos(num1))
break
case 't':
printf("结果为:%.2lf\n", tan(num1))
break
case 'l':
printf("结果为:%.2lf\n", log(num1))
break
case 'e':
printf("结果为:%.2lf\n", exp(num1))
break
default:
printf("无效的运算符!\n")
break
}
return 0
}