我一直在开发一个程序,以借助堆栈将中缀输入转换为后缀。
我制作的程序如下
这是一个无限循环,没有打印任何相关内容。我一直在尝试查找错误,但没有成功,编译器也未发出任何警告。
#include<stdio.h>
char po[20];
int top = -1;
void push(char x) {
po[++top] = x;
}
char pop() {
if (top == -1)
return -1;
else
return po[top--];
}
int priority(char x) {
if (x == '(')
return 0;
if (x == '+' || x == '-')
return 1;
if (x == '*' || x == '/')
return 2;
}
main() {
char st[20], x;
int a, c = 0, op;
printf("Enter the expression ");
scanf("%s", st);
while (st[c] != '\0') {
if (st[c] >= 'a' && st[c] <= 'z')
printf("%c", st[c]);
else if (st[c] == '(')
push(st[c]);
else if (st[c] == ')')
;
{
while ((x = pop()) != '(')
printf("%c", pop());
}
if (st[c] == '*' || st[c] == '/' || st[c] == '+' || st[c] == '-'
|| st[c] == '^') {
while (priority(po[top]) >= priority(st[c]))
printf("%c", pop());
push(st[c]);
}
c = c + 1
}
while (top != -1) {
printf("%c", pop());
}
}
答案 0 :(得分:1)
编译器也没有发出任何警告。
节省时间。启用所有警告或获得更好的编译器。
warning: control reaches end of non-void function [-Wreturn-type]
查看下面的函数,并发现它没有为所有可能的x
返回一个值。
int priority(char x) {
if (x == '(')
return 0;
if (x == '+' || x == '-')
return 1;
if (x == '*' || x == '/')
return 2;
// Missing return
}
warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
以下代码可疑。您真的要在;
之后再输入else if (st[c] == ')')
吗?
else if (st[c] == ')')
;
error: expected ';' before '}' token
肯定是错字(缺少;)
// c = c + 1
c = c + 1;
也可能存在其他问题。
答案 1 :(得分:0)
这是至少没有给出无限循环的代码版本。
更改为注释:
{ }
与if
块和循环块一起使用。在这段代码中,除了其他人指出的不必要的;
之外,您还要弹出两次!这不是你想要的。如果弹出printf()
,则此while
循环将永远不会终止,因为它将永远不会看到(
。
else if(st[c]==')') {
while((x=pop()) != '(') {
printf("%c",pop());
}
}
这是固定代码的样子:
else if(st[c]==')') {
while((x=pop()) != '(') {
printf("%c",x);
}
}
最后,您的函数始终具有默认的return
。
#include<stdio.h>
char po[20];
int top = -1;
void push(char x)
{
po[++top] = x;
}
char pop()
{
if(top==-1)
return -1;
else
return po[top--];
}
int priority(char x)
{
if(x == '(')
return 0;
if(x == '+' || x == '-')
return 1;
if(x == '*' || x == '/')
return 2;
return -1;
}
int main()
{
char st[20],x;
int a,c=0,op;
printf("Enter the expression ");
scanf("%s",st);
while(st[c]!='\0')
{
if(st[c]>='a'&& st[c]<='z') {
printf("%c",st[c]);
}
else if(st[c]=='(') {
push(st[c]);
}
else if(st[c]==')') {
while((x=pop()) != '(') {
printf("%c",x);
}
}
if(st[c]=='*' || st[c]=='/' || st[c]=='+' || st[c]=='-' || st[c]=='^')
{
while(priority(po[top])>priority(st[c])) {
printf("%c",pop());
}
push(st[c]);
}
c=c+1;
}
while(top!=-1)
{
printf("%c",pop());
}
}
输出内容如下:
junglefox @ ubuntu:〜/ test_programs / $
./ test输入表达式(2 + 3)* 4/5 * 2 * 3-4 /(5 + 4)
+ ** / * + /-junglefox @ ubuntu:〜/ test_programs / $