链接里是带小括号表达式计算的代码
谢谢各位大佬!
1条回答 默认 最新
- qq_39525174 2018-11-28 04:02关注
做了2个小时,一定要给我悬赏呀。
先做一些说明:
1.你提供的那个网站写的并不好,我给你个更好的,https://www.cnblogs.com/hantalk/p/8734511.html
2.这个的输入不能有空格,这个是因为这里使用的是C语言的scanf,如果你使用C++的getline的话,就可以读入带空格的输入了代码如下:
#include
#include
#define MaxSize 100
//检验错误的栈
struct errstack
{
char data[MaxSize];
int top;
}es;
//符号栈
struct opstack {
char data[MaxSize];//存储操作符
int top;//指向栈顶的指针
}op;
//数值栈
struct ststack {
float data[MaxSize];//存储操作符数
int top;//指向栈顶的指针
}st;int checkError(char exp[])
{
int i = 0;
es.top = -1;
while (exp[i] != '\0')
{
if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{')
{
es.top++;
es.data[es.top] = exp[i];
}
else if(exp[i] == ')' || exp[i] == ']' || exp[i] == '}')
{
switch (exp[i])
{
case ')':
if (es.top != -1)
{
if (es.data[es.top] != '(')
{
return 0;
}
else
{
es.top--;
}
}
else
{
return 0;
}
break;
case ']':
if (es.top != -1)
{
if (es.data[es.top] != '[')
{
return 0;
}
else
{
es.top--;
}
}
else
{
return 0;
}
break;
case '}':
if (es.top != -1)
{
if (es.data[es.top] != '{')
{
return 0;
}
else
{
es.top--;
}
}
else
{
return 0;
}
break;
}
}
i++;
}
if (es.top != -1)
return 0;
else
return 1;
}
//将算术表达式exp转换为后缀表达式postexp
void trans(char exp[], char postexp[]) {
char ch;
int i = 0, j = 0; //i扫描exp的下标,j扫描postexp的下标
op.top = -1;
ch = exp[i]; i++;
while (ch != '\0')
{
switch (ch) {
case '(': //左括号
op.top++; op.data[op.top] = ch;
break;
case ')': //右括号
while (op.data[op.top] != '(')//若遇到右括弧“)”,则连续出栈输出,直到遇到左括弧“(”为止。其中,左括弧出栈但是并不输出
{
postexp[j] = op.data[op.top]; j++;
op.top--;
}
op.top--;
break;
case '[':
op.top++; op.data[op.top] = ch;
break;
case ']':
while (op.data[op.top] != '[')//若遇到右括弧“]”,则连续出栈输出,直到遇到左括弧“[”为止。其中,左括弧出栈但是并不输出
{
postexp[j] = op.data[op.top]; j++;
op.top--;
}
op.top--;
break;
case '{':
op.top++; op.data[op.top] = ch;
break;
case '}':
while (op.data[op.top] != '{')//若遇到右括弧“}”,则连续出栈输出,直到遇到左括弧“{”为止。其中,左括弧出栈但是并不输出
{
postexp[j] = op.data[op.top]; j++;
op.top--;
}
op.top--;
break;
case '+': //为'+'或'-'时,其优先级不大于栈顶任何运算符的优先级,直到')'
case '-':
while (op.top != -1 && op.data[op.top] != '(' && op.data[op.top] != '[' && op.data[op.top] != '{')
{
postexp[j] = op.data[op.top]; j++;
op.top--;
}
op.top++; op.data[op.top] = ch;
break;
case '*':
case '/': //为'*'或'/'时,其优先级不大于栈顶为'*'或'/'的优先级,直到')'
while (op.top != -1 && op.data[op.top] != '(' && op.data[op.top] != '[' && op.data[op.top] != '{'
&& (op.data[op.top] == '*' || op.data[op.top] == '/')) {
postexp[j] = op.data[op.top]; j++;
op.top--;
}
op.top++; op.data[op.top] = ch;
break;
case ' ': break; //过滤空格
default:
while (ch >= '0' && ch <= '9')
{
postexp[j] = ch; j++;
ch = exp[i]; i++;
}
i--;
postexp[j] = '#'; j++;
//postexp[j]=' '; j++; //用空格标识一个数值串结束} ch = exp[i]; i++; } while (op.top != -1) { //此时,exp扫描完毕,栈不空时出栈并存放到postexp中 postexp[j] = op.data[op.top]; j++; op.top--; } postexp[j] = '\0'; //给postexp表达式添加结束标识
}
//对后缀表达式postexp求值
float compvalue(char postexp[]) {
float d;
char ch;
int i = 0;
st.top = -1;
ch = postexp[i]; i++;
while (ch != '\0')
{
switch (ch) {
case '+': st.data[st.top - 1] = st.data[st.top - 1] + st.data[st.top];//遇到操作符就弹出两个数 并将结果进栈
st.top--; break;
case '-': st.data[st.top - 1] = st.data[st.top - 1] - st.data[st.top];
st.top--; break;
case '*': st.data[st.top - 1] = st.data[st.top - 1] * st.data[st.top];
st.top--; break;
case '/':
if (st.data[st.top] != 0)
st.data[st.top - 1] = st.data[st.top - 1] / st.data[st.top];
else {
printf("\n\t除零错误!\n");//防止除数为0
exit(0);
}
st.top--; break;
default:
d = 0;
while (ch >= '0' && ch <= '9')//遇到操作数就进栈直到#为止
{
d = 10 * d + ch - '0';
ch = postexp[i]; i++;
}
st.top++;
st.data[st.top] = d;} ch = postexp[i]; i++; } return st.data[st.top];//输出栈顶元素就是结果
}
int main()
{
char exp[100];
scanf("%s", exp);
char postexp[100];
float f = 0.0;
//求exp的逆波兰式,得到postexp
while(!checkError(exp))
{
printf("input error,please input again!\n");
scanf("%s", exp);
}
trans(exp, postexp);
//对postexp求值
f = compvalue(postexp);
printf("%s = %.2f\n", exp, f);
system("pause");
return 0;
}本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报