C程序,堆栈计算器

时间:2012-12-28 22:10:56

标签: c stack calculator

有人可以看看我下面的代码并帮助我。我一直试图解决这个问题几个小时,但我不知道出了什么问题。这是一个用C编写的程序,它应该采用堆栈计算器的操作并存储数学表达式的操作数。执行操作时,将删除堆栈中的最后两个值并将其用作操作数,然后将操作结果放在堆栈上。但是,我没有得到正确的数字。请看一下我的代码。我知道它很长,但我很感激。感谢。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#define SIZE 10
#define MAXINPUT 255


void printStack(int stack[], int tos)
{
if (isEmpty(tos))
{
    printf("Stack is empty\n");
    printf("---------------------------------------\n");
    return;
}   

printf("Stack: ");
while (tos < SIZE)
{
    printf("[%d] " , stack[tos]);
    tos++;

}   
printf("\n---------------------------------------\n");

}   


int top (int stack[], int tos)
{
if(isEmpty(tos))
    return;
return stack [tos];
}

int isEmpty(int tos)
{

if (tos < 0)
    return 1;
}

int isFull (int tos)
{

if(tos >= SIZE - 1)
    return 1;

}   

void push(int val, int stack [], int *tos)
{
if(isFull(*tos))
    return;
(*tos)++;
stack[*tos] = val;


}

int pop (int stack [], int *tos)
{

if(isEmpty(*tos))
    return;
int val = stack[*tos];
(*tos)--;
return val;
}

void clear(int *tos)
{
*tos = -1;

}   

int getInput (char *input)
{

printf("+------------------------------{Choose an option}------------------------------+\n");
printf("| (q) : quit the program.                                                      |\n"
       "| (integer value) : an integer value (either positive or negative) to push     |\n"
       "| (c) : clear the stack                                                        |\n"
       "| (=) : display top value on the stack                                         |\n"
       "| (+) : addition                                                               |\n"
       "| (-) : subtraction                                                            |\n"
       "| (*) : multiplication                                                         |\n"
       "| (/) : division - integer division only                                       |\n"
       "| (%) : modulus - remainder from an integer division                           |\n"
       "| (^) : exponentiation (x raised to the power of y)                            |\n"
       "+------------------------------------------------------------------------------+\n");
printf("Input: ");
gets(input);
if(strcmp(input, "q") == 0)
{
    printf("Exiting...\n");
    return 0;
}
return 1;
}   

int isNum(char *input)
{
int i;
for(i = 0; i < strlen(input); i++)
{
    if(!isdigit(input[i]))
        return 0;
}   
return 1;

}   

int hasTwo(tos)
{
if((SIZE - tos) >= 2)
    return 1;

printf("\nStack size is 1, must have 2 or more\n");
return 0;
}
void mathOp (char op, int stack[], int *tos)
{
if(!isEmpty(*tos))
    return;
if(!hasTwo(*tos))
    return;

int right = pop(stack, tos);
int left = pop(stack, tos); 
switch(op)
{
    case '+': 
        push((left + right), stack, tos);
        break;
    case '-': 
        push((left - right), stack, tos);
        break;
    case '*': 
        push((left * right), stack, tos);
        break;
    case '/': 
        push((left/right), stack, tos);
        break;
    case '%': 
        push((left % right), stack, tos);
        break;
    case '^': 
        push(pow(left, right), stack, tos);
        break;
}       

}   

int main(int argc, char **argv)
{
int verbose = 0;
int debugMode = 0;
if (argc == 2 && argv[1][0] == '-' && argv[1][1] == 'd')
{   
    debugMode = 1;
    if (strcmp("-dv", argv[1]) == 0)
    {
        verbose = 1;
    }
}

int stack[SIZE];
int tos = -1;
char input[MAXINPUT];
while (getInput(input))
{
    int result = 0;
    if (strcmp(input, "c") == 0)
        clear(&tos);
    else if (strcmp(input, "=") == 0)
    {

        result = top(stack, tos);
        printf("Top of Stack is [%d]\n", result);
    }
    else if (isNum(input))
        push(atoi(input), stack, &tos);
    else if(strcmp(input, "+") == 0 ||
            strcmp(input, "-") == 0 ||
            strcmp(input, "*") == 0 ||
            strcmp(input, "/") == 0 ||          
            strcmp(input, "%") == 0 ||          
            strcmp(input, "^") == 0 ) mathOp(input[0], stack, &tos);
    else
        printf("Invalid input\n");

    if (debugMode)
        printStack(stack, tos);     
}

return 0;
}

1 个答案:

答案 0 :(得分:2)

此代码中存在很多问题。使用-Wall(或等效设置)进行编译,以查找isEmptyisFull以及toppop并且(始终)正确返回值

每个需要返回内容的函数都必须以return语句结尾。没有&#39;默认返回值&#39; C中的某些种类。

以此为例:

int isFull (int tos)
{
    if(tos >= SIZE - 1)
        return 1;

    return 0; // <-- not full, you probably want to return 0
}

PS。您需要在帮助文本中使用%%作为文字%

修改以修复所有内容:

  1. printStack严重受损,您需​​要从0循环到tos,而不是从tos循环到SIZE

  2. hasTwo需要测试tos>=1

  3. mathOp需要先测试if(isEmpty(*tos)),然后移除{&1;},如果不是空的话,请删除#34;

  4. 然后它应该工作。