使用链表实现栈

Implementation of stack using linked list

我在 Turbo C++ 代码的第 91 行收到“Function should return a value”错误,请帮助我,因为我必须提交我的项目,我知道 Turbo C++ 是一个非常老的编译器,但那是我们大学老师推荐的,所以我对此无能为力

'''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''

#include <stdio.h>
#include <conio.h>

struct stack
{
    int element;
    struct stack *next;
} * top;

void push(int);
int pop();
void display();

void main()
{
    int num1, num2, choice;

    while (1)
    {
        clrscr();
        printf("Select a choice from the following:");
        printf("\n[1] Push an element into the stack");
        printf("\n[2] Pop out an element from the stack");
        printf("\n[3] Display the stack elements");
        printf("\n[4] Exit\n");
        printf("\n\tYour choice: ");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
        {
            printf("\n\tEnter the element to be pushed into the stack: ");
            scanf("%d", &num1);
            push(num1);
            break;
        }

        case 2:
        {
            num2 = pop();
            printf("\n\t%d element popped out of the stack\n\t", num2);
            getch();
            break;
        }

        case 3:
        {
            display();
            getch();
            break;
        }

        case 4:
            exit(1);
            break;

        default:
            printf("\nInvalid choice !\n");
            break;
        }
    }
}

void push(int value)
{
    struct stack *ptr;
    ptr = (struct stack *)malloc(sizeof(struct stack));

    ptr->element = value;

    ptr->next = top;
    top = ptr;
    return;
}

int pop()
{
    if (top == NULL)
    {
        printf("\n\STACK is Empty.");
        getch();
        exit(1);
    }
    else
    {
        int temp = top->element;
        top = top->next;
        return (temp);
    }
}

void display()
{
    struct stack *ptr1 = NULL;
    ptr1 = top;
    printf("\nThe various stack elements are:\n");
    while (ptr1 != NULL)
    {
        printf("%d\t", ptr1->element);
        ptr1 = ptr1->next;
    }
}

'''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''

您可以如下更改 pop 函数(假设您没有将 -1 作为元素存储在堆栈中)

int pop()
{
    if (top == NULL)
    {
        printf("\n\STACK is Empty.");
        getch();
        return -1;// or other invalid value which indicates stack empty
    }
    else
    {
        int temp = top->element;
        top = top->next;
        return (temp);
    }
}

并在你调用的地方修改如下

case 2:
{
    num2 = pop();
    if(num2 != -1) {
        printf("\n\t%d element popped out of the stack\n\t", num2);
        getch();
    }else{
        printf("Stack is Empty\n");
        exit(1);
    }
    break;
}

编译器报错,因为在 if 语句之外没有 return 语句。即使您在 if 分支中调用 exit,从句法上讲,这只是另一个函数调用; 在结构上,编译器会看到一条路径,您可以在其中到达函数体的结束 },而无需 return 语句。

您想确保 returnif-else 语句的主体之外是可访问的,最好的方法是将 else 分支从语句中取出完全:

int pop( void )
{
  int temp;

  if ( !top )
  { 
    fputs( "Stack is empty", stderr );
    exit( 1 );
  }

  temp = top->element;
  top = top->next;
  return temp;
}