评估后缀表达式时会产生不需要的符号

时间:2016-08-05 06:17:54

标签: c data-structures

我正在尝试制作一个C程序来评估后缀表达式,当这样做时,屏幕上会输入一个不需要的符号用于输入45+。 附:请告诉我错误(除了那个得到()我正在研究如何使用fgets())

// to Evaluate a postfix expression
#include<stdio.h>
#include<conio.h>
int is_operator(char);
void answer();
char stack[100];
int top =-1;
void push(char);
char pop();
void main()
{
char postfix[100],item;
int i=0;
clrscr();
printf("Enter Postfix Expression");
gets(postfix);
while(postfix[i]!='\0')
    {
    item=postfix[i];
    if(is_operator(item)==2)
        {
        push(item);
        }
    if(is_operator(item)==1)
        {
        char op;
        int n1,n2,n3;
        op=item;
        n1=pop();
        n2=pop();
        switch(op)
        {
            case '+':
            n3=n1+n2;
            case '-':
            n3=n1-n2;
            case '*':
            n3=n1*n2;
            case '/':
            n3=n1/n2;
        }
        push(n3);
        }
    i++;
    }//end while
answer();
getch();
}
void push(char c)
{
top++;
stack[top]=c;
}
char pop()
{
char c;
c=stack[top];
top--;
return(c);
}
int is_operator(char i)
{
char ch=i;
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
    {
    return(1);
    }
else
    {
    return(2);
    }
}
void answer()
{
char ans;
ans=stack[top];
printf("Answere is %c",ans);
}

2 个答案:

答案 0 :(得分:1)

您的代码中存在很多错误。请尝试正确键入强制转换。

通过评论来理解错误。

浏览this以了解字符指针和数组。

//评估后缀表达式

#include<stdio.h>



int is_operator(char);
void answer();
int stack[100];//Use integer array since operands are integer
int top =-1;
void push(int);//Arguments changed to integer type since the stack is integer 
int pop(); //Return type to integer
void main()
{
char* postfix;//Use character pointer for iterating through loop smoothly
 int item;
int i=0;

printf("Enter Postfix Expression");
gets(postfix);
char c;

while(*postfix!='\0')
    {
    c=*postfix;
    if(is_operator(c)==2)
        {
        push((c-'0')); //Converting char to int before pushing it into the stack
        }
    if(is_operator(c)==1)
        {


        char op;
        int n1,n2,n3;
        op=*postfix;
        n1=pop();
        n2=pop();
        switch(op)
        {
            case '+':
            n3=n1+n2;
            break;
            case '-':
            n3=n1-n2;
            break;
            case '*':
            n3=n1*n2;
            break;
            case '/':
            n3=n1/n2;
            break;
        }
        push(n3);
        }
    postfix++;
    }//end while
answer();

}
void push(int c)
{
top++;
stack[top]=c;
}
int pop()
{
int c;
c=stack[top];
top--;
return(c);
}
int is_operator(char i)
{
char ch=i;
if(ch=='+'||ch=='-'||ch=='*'||ch=='/')
    {
    return(1);
    }
else
    {
    return(2);
    }
}
void answer()
{
char ans;
ans=stack[top];
printf("Answere is %d",ans);
}  

我希望它有用....

答案 1 :(得分:0)

我在您的代码中看到的问题是:switch()个别break条款case上缺少default条款(dc案例也可能不错);当你将非操作符(也就是单个数字的数字)推到堆栈上时,你将它们作为字符代码推送,而不是将它们转换为数字,这样数学就没有意义;你没有正确处理减法和除法等非共同操作的顺序(使用Unix // Evaluate a postfix expression #include <ctype.h> #include <stdio.h> #include <stdbool.h> char stack[100]; int top = -1; void push(char); char pop(void); bool is_operator(char); void answer(void); void push(char c) { stack[++top] = c; } char pop() { return stack[top--]; } bool is_operator(char op) { return (op == '+' || op == '-' || op == '*' || op == '/'); } void answer() { printf("Answer is %d\n", stack[top]); } int main() { char item, postfix[100]; int i = 0; printf("Enter Postfix Expression: "); gets(postfix); while ((item = postfix[i++]) != '\0') { if (is_operator(item)) { char n1 = pop(); char n2 = pop(); char n3 = 0; switch (item) { case '+': n3 = n1 + n2; break; case '-': n3 = n2 - n1; break; case '*': n3 = n1 * n2; break; case '/': n3 = n2 / n1; break; } push(n3); } else if (isdigit(item)) { push(item - '0'); } } // end while answer(); return 0; } 命令作为比较工具);最后,不要重新发明布尔。下面是对代码的修改,包括上述更改和一些样式调整:

> ./a.out
Enter Postfix Expression: 6 4 - 7 * 1 +
Answer is 15
> dc
6 4 - 7 * 1 + p
15

示例(注意此评估程序仅对单个数字的数字进行操作):

    let aDisposeBag = DisposeBag()
    class LoginController: NSViewController {
    @IBOutlet weak var accountField: NSTextField!
    @IBOutlet weak var passwdField: NSSecureTextField!
    @IBOutlet weak var loginBtn: NSButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        let accAvailable = accountField.rx_text.map({(aa)-> Bool in
            print("aa")
            return aa.characters.count > 0
        })

        let passAvailable = passwdField.rx_text.map({(aa)-> Bool in
            print("bb")
            return aa.characters.count > 0
        })

        let allAvailable = Observable.combineLatest(accAvailable, passAvailable){$0 && $1}
        allAvailable.bindTo(loginBtn.rx_enabled).addDisposableTo(aDisposeBag)

    }
}