03 顺序栈
实现计算器,但出了bug,不想改了,思路没问题就行
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "ctype.h" // 查查这些头文件的作用
typedef int elemtype; // 将所有的float类型都转换为elemtype ,没必要也许
// (1) 顺序栈
typedef struct Stack
{
elemtype data[100];
int top; // 不用base,因为base默认一直是0
} *Sqstack;
// (2)全局变量
char ch[7] = {'+', '-', '*', '/', '(', ')', '#'};
int f1[7] = {3, 3, 5, 5, 1, 6, 0};
int f2[7] = {2, 2, 4, 4, 6, 1, 0};
int n = 0;
// 初始化栈,不用额外开辟一片空间也行
void initStack(Sqstack s)
{
s->top = 0;
}
// 入栈
void push(Sqstack s, elemtype e)
{
// s->top++;
s->data[s->top] = e;
s->top++;
}
// 出栈
void pop(Sqstack s, elemtype *e)
{
*e = s->data[s->top];
s->top--;
}
// 获得栈顶元素
elemtype getTop(Sqstack s)
{
return s->data[s->top-1];
}
// 判断栈是否为空
bool stackEmpty(Sqstack s)
{
if (s->top == 0)
{
return true;
}
else
return false;
}
// 将运算符转化为 通过获得在数组的位置-->获得优先级-->再比较优先级
elemtype cton(char c)
{
switch (c)
{
case '+':
return 0;
break;
case '-':
return 1;
break;
case '*':
return 2;
break;
case '/':
return 3;
break;
case '(':
return 4;
break;
case ')':
return 5;
break;
case '#':
return 6;
break;
default:break;
}
}
// 比较优先级: 通过获得在数组的位置,获得优先级,再比较优先级
char compare(char c1, char c2)
{
int i1 = cton(c1); // 栈顶
int i2 = cton(c2); // 当前
if (f1[i1] > f2[i2])
{
return '>';
}
else if (f1[i1] < f2[i2])
{
return '>';
}
else
{
return '=';
}
}
// 四则运算
elemtype operate(elemtype a, elemtype t, elemtype b)
{
int result;
switch (t)
{
case 0:
result = a + b;
break;
case 1:
result = a - b;
break;
case 2:
result = a * b;
break;
case 3:
result = a / b;
break;
}
return result;
}
// ****************************************最核心的代码************************************
elemtype EvaluateExpression()
{
Sqstack OPTR, OPND;
initStack(OPND);
initStack(OPTR);
push(OPTR,cton('#'));
printf("栈顶元素:%d\n",getTop(OPTR));
elemtype a, t, b;
elemtype e; // 出栈的元素
elemtype sum=0; // 输入的一个数字
char c;
c = getchar(); // 一次读取单个字符
while (c != '#' || ch[getTop(OPTR)] !='#')
{
// 数字入栈就行
if (isdigit(c)) // 数字入栈就行
{
sum = 0;
while (isdigit(c))
{
sum = sum * 10 + (c - '0'); // 将字符c转化为对应的数字
c = getchar();
}
push(OPND, sum);
printf("%d:入栈成功!\n",getTop(OPND));
}
else
{ // 关于操作符的操作
// printf("当前栈顶元素:");
printf("%c\n",c);
char temp=ch[getTop(OPTR)];
printf("%c\n",temp);
switch (compare(ch[getTop(OPTR)],c))
{
case '<':
push(OPTR, cton(c));
printf("栈顶元素:%d\n",getTop(OPTR));
break; // 入栈的是经过转换后的 float型数据
case '=':
pop(OPTR, &e);
c = getchar();
break;
case '>':
pop(OPND, &a);
pop(OPTR, &t);
pop(OPND, &b);
push(OPND, operate(a,t,b));
break;
}
}
} // endwhile!
return getTop(OPND); // 最终的返回值
}
// 菜单
// int memu
// {
// }
// 四则运算,返回运算结果
// 最终结果
// 将所有类型(float,char)都转换为float类型,为了方便只写一遍栈的基本操作而已
int main()
{
int result;
int n;
printf("***********************欢迎使用表达式求值小程序*************************\n");
printf("请输入你要计算的表达式(以#结束):\n");
do
{
result = EvaluateExpression();
printf("计算结果:%f", result);
printf("1.继续使用; 0.退出程序");
scanf("%d", &n);
} while (n != 0);
printf("***********************退出程序!*************************\n");
return 0;
}