#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;
}
#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;
}