今天开始学习栈了了解了下什么叫做栈说就是一种特殊点的线性表什么什么的,大概有点了解了然后书上介绍了四则运算的方法,先把输入的四则运算改成后缀式,最后计算。具体算法大家自己百度把,看起来好像不是很难于是乎我开始动手写了,按照自己的想法写完之后开心的按下了Ctrl+ F5 结果一堆BUG和error 弄了三个小时终于是实现功能了,当然还是很不完善,大牛勿喷。[C] 纯文本查看 复制代码 #include<stdio.h>//9+(3-1)*3+10/2
#include<windows.h>
//#include<string.h>
int main()
{
char str[100] = { '\n' };
char temp[100] = { '\n' };
char ch,t;
int calc[50];
int i = 0, j = 0, k, l = 0;
t = '\n';
printf("请输入一个四则混合运算:");
//开始处理原式
while ((ch = getchar()) != '\n')//一个一个的读取输入的字符
{
if (ch == '(')//如果是'('直接压栈
{
temp[i] = ch;
i++;
}
else if(ch == ')')//如果是')'就把栈顶元素输出到后缀表达式存放数组str 直到栈顶元素为'('
{
while (temp[i-1]!='(')
{
if (i == 0)//')'个数多于'('
{
printf("括号不匹配!\n");
system("pause");
return 0;
}
str[j] = ' ';//数字数字符号符号直接全部加上空格为了防止123不知道是1 2 3 还是12 3 这种情况
j++;
str[j] = temp[i - 1]; //把栈顶元素输出到后缀表达式存放数组str
i--;
j++;
}
i--;
}
else if(ch == '*' || ch == '/')//如果是'*' 或者 '/'
{
if (!(t == '+' || t == '-' || t == '*' || t == '/')) //判断是否连续输入符号 如5 ++ 6
{
str[j] = ' ';
j++;
while (temp[i - 1] == '*' || temp[i - 1] == '/') //只要优先级没有比栈顶的高就出栈直到优先级高于栈顶的或者栈顶为'('
{
str[j] = ' ';
j++;
str[j] = temp[i - 1];
i--;
j++;
}
temp[i] = ch;//最后再压栈
i++;
}
else
{
printf("不能连续输入运算符号!\n!");
system("pause");
return 0;
}
}
else if(ch == '+' || ch == '-')//如果是'+' 或者 '-'
{
str[j] = ' ';
j++;
if (!(t == '+' || t == '-' || t == '*' || t == '/'))
{
while (temp[i - 1] != '(' && i>0) //优先级最低了所以除非栈顶是'('否则全部出栈
{
str[j] = ' ';
j++;
str[j] = temp[i - 1];
i--;
j++;
}
temp[i] = ch;
i++;
}
else
{
printf("不能连续输入运算符号!\n!");
system("pause");
return 0;
}
}
else if (ch >= '0' && ch <= '9') // 如果是数字直接输出到后缀表达式存放数组str
{
str[j] = ch;
j++;
}
else
{
printf("存在非法字符!\n");
system("pause");
return 0;
}
t = ch;
}
while (i>0)
{
if (temp[i - 1] != '(')//把栈中的全部输出到后缀表达式存放数组str
{
str[j] = ' ';
j++;
str[j] = temp[i - 1];
i--;
j++;
}
else//'('个数多
{
printf("括号不匹配!\n");
system("pause");
return 0;
}
}
k = 0;
/*
for (i = 0; i < j; i++)
{
printf("%c",str[i]);
}
*/
for (i = 0; i < j; i++) // 还要对后缀表达式进行处理把 '3''8' 变成 38 储存以用于计算
{
if (str[i] >= '0' && str[i] <= '9') //如果是数字
{
if (str[i + 1] != ' ') //判断下一个是不是空格
{
k = k * 10 + (str[i] - 48);//如果不是说明类似于123 是123 不是1 2 3 现在读取的1还不是结果 进行计算
}
else//如果是空格
{
if (k == 0)//判断是不是一位数(数字是就是0哪边都可以)
{
calc[l] = str[i] - 48;//是一位数就直接保存当前数字
}
else
{
k = k * 10 + (str[i] - 48);//不是进行最后一次运算得到结果在保存 并初始化K
calc[l] = k;
k = 0;
}
l++;
while (str[i + 1] == ' ')//清理空格
{
i++;
}
}
}
//至此对原式的处理全部完毕
//开始计算 算法自己百度
else if (str[i] == '+')
{
l = l - 1;
calc[l-1] = calc[l-1] + calc[l ];
}
else if(str[i] == '-')
{
l = l - 1;
calc[l-1] = calc[l-1] - calc[l];
}
else if (str[i] == '*')
{
l = l - 1;
calc[l-1] = calc[l-1] * calc[l];
}
else if (str[i] == '/')
{
l = l - 1;
calc[l-1] = calc[l-1] / calc[l];
}
else
{
while (str[i + 1] == ' ')
{
i++;
}
}
}
printf("结果是:%d\n", calc[l-1]);
system("pause");
return 0;
}
|