数据结构题目(c语言),把只能实现带小括号的表达式计算改为可以带小中大括号的表达式计算

链接里是带小括号表达式计算的代码
题目要求
谢谢各位大佬!

0

1个回答

做了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;
}

1
yituei
yituei 非常感谢!我下午看到你的回答,想着可以增加悬赏,但是找了半天没找到这项功能,也不能直接赠送C币,真的很不好意思,再次感谢!
9 个月之前 回复
caozhy
贵阳挖掘机马善福,自备车辆专业挖游泳池 精神虽然可嘉,但是怪你眼瞎,提问没有悬赏,采纳也是白搭。下次看清再答!
9 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!