使用make命令中缀进行后缀转换

时间:2010-02-26 14:44:08

标签: linux

这是我的1.c内容

#include "2.h"
#include<stdio.h>
#include<string.h>

void push(int ele)
{
    stack[tos]=ele;
    tos++;
}

char pop()
{
    tos--;
    return(stack[tos]);
}

void show()
{
    int x=tos;    
    printf("--The Stack elements are.....");
    while(x!=0)
        printf("%c, ",stack[--x]);
}

//Function to get the precedence of an operator
int prec(char symbol)
{
    if(symbol== '(')
        return 0;

    if(symbol== ')')
        return 0;

    if(symbol=='+' || symbol=='-')
        return 1;

    if(symbol=='*' || symbol=='/')
        return 2;

    if(symbol=='^')
        return 3;

    return 0;
}

这是我的2.h内容

#define size 10

char stack[size];
int tos=0,ele;

void push();

char pop();

void show();

int isempty();

int isfull();

char infix[30], output[30];

int prec(char);

我的main.c内容是

#include "2.h"
#include<stdio.h>

#include<string.h>

int main()
{
    int i=0,j=0,k=0,length;

    char temp;

    printf("\nEnter an infix expression:");

    scanf("%s",infix);

    printf("\nThe infix expresson is %s",infix);

    length=strlen(infix);

    for(i=0;i<length;i++)
    {
        //Numbers are added to the out put QUE

        if(infix[i]!='+' && infix[i]!='-' && infix[i]!='*' && infix[i]!='/' && 
                infix[i]!='^' && infix[i]!=')' && infix[i]!='(' )
        {
            output[j++]=infix[i];

            printf("\nThe element added to Q is:%c",infix[i]);

        }
        //If an operator or a bracket is encountered...
        else
        {
            if(tos==0) //If there are no elements in the stack, the operator is added to it
            {
                push(infix[i]);

                printf("\nThe pushed element is:%c",infix[i]);

            }
            else
            {
                //Operators or pushed or poped based on the order of precedence
                if(infix[i]!=')' && infix[i]!='(')
                {
                    if(prec(infix[i]) <= prec(stack[tos-1]))
                    {
                        temp=pop();

                        printf("\n the poped element is :%c",temp);

                        output[j++]=temp;
                        push(infix[i]);
                        printf("\n The pushed element is :%c",infix[i]);

                        show();
                    }
                    else
                    {
                        push(infix[i]);
                        printf("\nThe pushed element is:%c",infix[i]);

                        show();
                    }
                }
                else
                {
                    if(infix[i]=='(')
                    {
                        push(infix[i]);

                        printf("\nThe pushed-- element is:%c",infix[i]);
                    }

                    if(infix[i]==')')
                    {
                        temp=pop();

                        while(temp!='(')
                        {
                            output[j++]=temp;

                            printf("\nThe element added to Q is:%c",temp);

                            //temp=pop();
                            printf("\n the poped element is :%c",temp);
                            temp=pop();
                        }
                    }
                }
            }
        }
        printf("\nthe infix expression is: %s",output);
    }

    while(tos!=0)
    {
        output[j++]=pop();
    }

    printf("the infix expression is: %s\n",output);
}

我在linux中使用MAKE

代码是

myapp: main.o 1.o
    gcc -o myapp main.c 1.c

main.o: main.c 2.h
    gcc -c main.c

1.o: 1.c 2.h
    gcc -c 1.c

但是我的错误即将来临

gcc -o myapp main.c 1.c
/tmp/ccy0qyI1.o:(.bss+0x0): multiple definition of `tos'
/tmp/ccQZzbOI.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [myapp] Error 1
我试图修复它。但无法解决

2 个答案:

答案 0 :(得分:1)

您正在头文件中定义全局变量tos,您可以在1.cmain.c中包含这两个变量。因此,您最终得到两个具有相同名称的全局变量。链接器不喜欢这样。作为传统的unix扩展,如果未明确初始化乘法定义的变量,链接器可以应对这种情况,但是代码初始化变量。

我建议您阅读在任何体面的大学图书馆中找到的K&R book

答案 1 :(得分:1)

@Thomas给了你一个很好的解释你的问题。全局变量tos声明位于标头文件2.h中,该文件在#include1.c中通过main.c包含两次。

如果您要分享变量tos,您应该在1.c或main.c中声明它,并修改2.h以将其声明为extern ,例如:

1.C:

int tos = 0;

2.H:

extern int tos;

然后你可以从main.c访问tos,但变量只定义一次。

补充工具栏:只是为了您自己的利益而提出的建议,并且为了在StackOverflow中共享未来的问题,请尽量减少源代码,以及生成错误的必要条件。到程序是微不足道的,因为那时bug会更容易被隔离(对于你和其他人),并且对于读者来说更清楚,他们应该关注什么。同时,强烈鼓励@Thomas建议 C编程语言作为任何 C程序员的优秀推荐。