C程序中的数据结构

时间:2018-03-21 03:29:26

标签: c data-structures

我需要帮助,因为我创建的某个程序无法运行,我不知道为什么。我的导师忽略了我的问题。该程序的问题是在将中缀转移到后缀时缺少操作员。提前致谢。顺便说一句,我注意到堆栈的声明类型是long int。但我知道为什么操作符号可以保留在堆栈内,即使操作符号不是整数。如果有人知道这件事,请帮助我。再次感谢。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX 100

void infixToPostfix(char infix[], char postfix[]);
long int evaluatePostfix(char postfix[]);
int precedence(char symbol);
int power(int b, int a);

long int stack[MAX];
int top = -1;
void push(char symbol);
char pop();
int isEmpty();

main()
{
    char infix[MAX], postfix[MAX];

    printf("Enter infix expression: ");
    gets(infix);

    infixToPostfix(infix, postfix);
    printf("Postfix expression is : %s\n", postfix);
    printf("Value of expression : %ld\n", evaluatePostfix(postfix));
}

void infixToPostfix(char infix[], char postfix[])
{
    unsigned int i, p;
    char next, symbol;

    p = 0;
    for (i=0; i<strlen(infix); i++)
    {
        symbol = infix[i];

        if (symbol == ' ' || symbol == '\t')/*ignore blanks and tabs*/
            continue;

        switch(symbol)
        {
            case '(':
                push(symbol);
                break;
            case ')':
                while ((next = pop()) != '(')
                postfix[p++] = next;
                break;
            case '+':
            case '-':
            case '*':
            case '/':
            case '%':
            case '^':
                while (!isEmpty() && precedence(stack[top]) >= precedence(symbol))
                postfix[p++] = pop();
                push(symbol);
                break;
            default:/*operand*/
                postfix[p++] = symbol;
        }
    }
    while (!isEmpty())
    postfix[p++] = pop();
    postfix[p] = '\0';/*Add '\0' to make postfix a string*/
}

int precedence(char symbol)
{
    switch(symbol)
    {
        case '(':
            return 0;
        case '+':
        case '-':
            return 1;
        case '*':
        case '/':
        case '%':
            return 2;
        case '^':
            return 3;
        default:
            return 0;
    }
}

long int evaluatePostfix(char postfix[])
{
    long int x, y, result;
    unsigned int i;
    for (i=0; i<strlen(postfix); i++)
    {
        if (postfix[i] <= '9' && postfix[i] >= '0')
            push(postfix[i]-'0');
        else
        {
            x = pop();
            y = pop();
            switch(postfix[i])
            {
                case '+':
                    push(y+x);
                    break;
                case '-':
                    push(y-x);
                    break;
                case '*':
                    push(y*x);
                    break;
                case '/':
                    push(y/x);
                    break;
                case '%':
                    push(y%x);
                    break;
                case '^':
                    push(power(y,x));
            }
        }
    }
    result = pop();
    return result;
}



int power(int b,int a)
{
    int i = 1;
    if (a = 0)
        return 1;
    else if (a = 1)
        return b;
    else if (a > 1)
    {
        for (i=1; i<a; i++)
            b = b * b;  
        return b;
    }

}
void push(char symbol)
{
    if (top == MAX-1)
    {
        printf("Stack Overflow\n");
        return;
    }
    top = top + 1;
    stack[top] = symbol;
}

char pop()
{
    char x;
    if (isEmpty())
    {
        printf("stack Underflow\n");
        exit(1);
    }
    x = stack[top];
    top = top - 1;
    return x;
}

int isEmpty()
{
    if (top = -1)
        return 1;
    else
        return 0;
}

3 个答案:

答案 0 :(得分:2)

isEmpty()例程中的简单错误:

int isEmpty()
{
    printf("top is %d\n", top);
    if (top = -1)
        return 1;
    else
        return 0;
}

错误是

if (top = -1)

应该是

if (top == -1)

答案 1 :(得分:1)

您应该在 isEmpty()函数中更改if条件。

替换,

if(top=-1)

通过

if(top==-1)

答案 2 :(得分:1)

之前正确地发现了isEmpty()中的错误。 if (top = -1) - &gt; if (top == -1)

正如您自己评论的那样,pow()在两点发生同样的问题,

if (a = 0)
    return 1;
else if (a = 1)
    return b;

应该是

if (a == 0)
    return 1;
else if (a == 1)
    return b;

但是第二次检查是超级的,因为如果你稍微修改它,它将被下面的部分覆盖,修复关于更高功率的错误(每次迭代都给你最后一个的平方)并返回一些{{1}是否定的:

a

我还建议,如果检查上限和下限,则不检查绑定旁边的值是否相等,但绑定上为int power(int b,int a) { int i = 1; int c = b; if (a == 0) return 1; else if (a >= 1) { for (i=1; i<a; i++) c *= b; // meaning c = c * b; return c; } else return -1; } <
因此,如果在某些情况下(可能是在一个更复杂的程序中或者如果你使用浮点数),你没有达到绑定旁边的值,你仍然会中止操作。

if > - &gt; (top == -1)