C堆栈阵列问题

时间:2011-04-11 11:43:24

标签: c arrays stack

我的peek功能代码不起作用?这是为什么?任何人都可以用我的窥视功能来帮助我吗?

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10

int stack[maxsize];
int stacktop=0;

void instructions();
int process();
int push(int value);
int pop();
void display();
void peek();

int main()
{
    process();
    getch();
}

int process()
{
    int val;
    int choice;
    do
    {
        instructions();

        printf("Enter Your Choice: ");
        scanf("%d",&choice);

        switch( choice )
        {
        case 1:
            printf("\nElement to be Pushed : ");
            scanf("%d",&val);
            push(val);
            break;

        case 2:
            val=pop();
            if(val!=-1)
            {
                printf("Popped Element : %d\n",val);
            }
            break;

        case 3:
            peek();
            break;

        case 4:
            display();
            break;

        case 5:
            break;       
        }

    }while(choice !=5);
}

void instructions()
{
    printf("Enter Your choice for the following process\n");
    printf("\n[1]Push a Node on top of the list");
    printf("\n[2]Pop a node off the list");
    printf("\n[3]Peek The Top Node");
    printf("\n[4]Display The Whole list");
    printf("\n[5]Exit The Program\n");
}

int push(int val)
{
    if(stacktop<maxsize)
    {
        stack[stacktop++]=val;
    }
    else
    {
        printf("Stack is full");
    }
}

int pop()
{
    int a;
    if(stacktop>0)
    {
        a=stack[--stacktop];
        return a;
    }
}

void display()
{
    int i;
    i = 0;
    if(stacktop>0)
    {
        printf("Elements are:");
        while(i<stacktop)
        {
            printf("\n%d--\n",stack[i++]);
        }

    }
}

void peek()
{
    printf("%d",stacktop);  
}

2 个答案:

答案 0 :(得分:2)

它应该是:

printf("%d\n", stack[stacktop - 1]);

打印内容,而不是堆栈的大小?

显然你还需要检查以确保你没有在堆栈范围之外打印(当它是空的时候)

答案 1 :(得分:2)

我知道这不是Code Review,但我想我会给你一些建议。

  1. 致电scanf时,请务必检查结果。例如,如果用户输入十进制数以外的内容,则代码最终会将不确定的值放入choiceval变量中。 scanf函数返回已成功读取的项目数。如果您要求一个项目,scanf返回1,那么您可以依赖该对象的值:

    int choice;
    if (scanf("%d", &choice) != 1)
        // handle error, can't rely on value of "choice"
    else
        // continue onwards, can rely on value of "choice"
    
  2. 通常,\n转义位于字符串文字的末尾,而不是开头。以这种方式这样做更为常见,但这并不意味着它应该总是在最后。

    printf("Enter Your choice for the following process\n\n");
    printf("[1]Push a Node on top of the list\n");
    printf("[2]Pop a node off the list\n");
    printf("[3]Peek The Top Node\n");
    
  3. 要输出简单字符串,请考虑使用puts函数,该函数会自动为您添加换行符:

    puts("Enter Your choice for the following process");
    puts("");
    puts("[1]Push a Node on top of the list");
    puts("[2]Pop a node off the list");
    puts("[3]Peek The Top Node");
    
  4. 您的display方法是何时使用for循环而不是while循环的完美示例。一般来说,当您确切知道自己拥有多少项并希望迭代它们时,请使用for循环:

    void display()
    {
        int i;
    
        puts("Elements are:");
    
        for (i = 0; i < stacktop; i++)
            printf("\n%d--\n", stack[i]);
    }
    
  5. 要反转堆栈的顺序,只需从顶部开始然后向后退:

    void display()
    {
        int i;
    
        puts("Elements are:");
    
        for (i = stacktop - 1; i >= 0; i--)
            printf("\n%d--\n", stack[i]);
    }