C编程之计算器程序设计

来源:互联网 发布:淘宝客服培训资料大全 编辑:程序博客网 时间:2024/05/09 06:46
#include <stdio.h>
#include <stdlib.h>


#define STACK_SIZE 100
#define OK        0   
#define ERROR    -1  


typedef int DATATYPE;
typedef struct
{
int data[STACK_SIZE]; // 栈数组
int top;                   // 栈顶下标
}SeqStack;


int InitStack (SeqStack *s)
{
if (s == NULL)
{
return ERROR;
}

s->top = -1;

return OK;
}


int lv(char a)//优先级判断
{
switch (a)
{
case '(':
{
return 3;
}
case '*':
{
return 2;
}
case '/':
{
return 2;
}
case '+':
{
return 1;
}
case '-':
{
return 1;
}
default: 
{
return ERROR;
}
}


}


// 判断满栈
int StackFull(SeqStack *s)
{
if (s == NULL)
{
return ERROR;
}

return s->top == STACK_SIZE-1;
}


// 判断空栈
int StackEmpty(SeqStack *s)
{
if (s == NULL)
{
return ERROR;      // 错误返回-1  
}

return s->top == -1;   // 相等返回1 不相等返回0
}


// 压栈
int Push(SeqStack *s, int data)
{
if (s == NULL)
{
return ERROR;
}
// 判断是否满栈
if (StackFull(s))
{
return ERROR;
}

/* s->top++;
s->data[s->top] = data; */
s->data[++s->top] = data;

return OK;
}


// 出栈
int Pop(SeqStack *s)
{
if (s == NULL)
{
return ERROR;
}

// 判断是否空栈
if (StackEmpty(s))
{
return ERROR;
}

DATATYPE data = s->data[s->top--];

return data;
}


// 获取栈顶元素
int GetTop(SeqStack *s)
{
if (s == NULL)
{
return ERROR;
}

// 判断是否空栈
if (StackEmpty(s))
{
return ERROR;
}

return s->data[s->top];;
}






int count1()//四则运算
{
SeqStack num;   // 栈结构体变量
SeqStack opt; 
if (InitStack(&num) != OK)
{
return -1;
}
if (InitStack(&opt) != OK)
{
return -1;
}

if ((InitStack(&num) && InitStack(&opt)) != OK)
{
return -1;
}
int i = 0;
int t = 0;
int m = 0;
char a[100];
printf("Input:\t");
scanf("%s",a);
if(a[i] == 'B')
{
return 0;
}
if(a[i] == 'A')
{
return 1;
}
while(!StackEmpty(&opt) || '\0' != a[i])//start
{
//a[i]为数字,进栈
if(a[i] >= '0' && a[i] <= '9')
{
t = t*10 + (int)(a[i++]-48);
if(a[i] < '0' || a[i] > '9')
{
Push(&num,t);
t = 0;
}
continue;
}
//a[i]为运算符
else
{
if('(' == GetTop(&opt) && ')' == a[i])
{
Pop(&opt);
i++;
continue;
}

if(StackEmpty(&opt) && '\0' != a[i] || '(' == GetTop(&opt) && a[i] != ')')
{
Push(&opt,(int)a[i++]);
continue;
}

if( ')' == a[i] || '\0' == a[i] || lv(a[i]) <= lv(GetTop(&opt)) )
{
switch(Pop(&opt))//出栈计算 再入栈
{
case '*':
{
Push(&num,Pop(&num)*Pop(&num));
break;
}
case '/':
{
m=Pop(&num);
Push(&num,Pop(&num)/m);
break;
}
case '+':
{
Push(&num,Pop(&num)+Pop(&num));
break;
}
case '-':
{
m = Pop(&num);
Push(&num,Pop(&num)-m);
break;
}
default:
{
break;
}
}
continue;
}
if(lv(a[i]) >= lv(GetTop(&opt)))
{
Push(&opt,(int)a[i++]);
continue;
}
}
}

printf("\t%s = %d\n",a,Pop(&num));

return 1;
}


int main()
{
int flag = 1;
while(flag)
{
printf("\n\tczh的计算器  \n");
printf("\t功能选择:\n");
printf("\t默认功能 四则运算器\n\t A.科学计算\n\t B.退出程序 \n");
flag = count1();
}
return 0;
}

1 0
原创粉丝点击