C中的静态堆栈操作

时间:2013-01-23 07:16:26

标签: c stack

我正在尝试使用C中的数组执行堆栈上的所有操作(推送,弹出,窥视,更新,显示)。当我在调用所有函数后最后调用show()时工作正常我需要的。但是,无论何时我在任何操作之前调用show(),都不会给我相应的结果。 我正在使用以下代码:

int main()
{
    push(1);
    push(2);
    push(3);
    push(4);
    push(6);
    pop();
    push(5);
    show();//line 8
    //push(7);//line 9
    //pop();
    //peep();
    //update();
    //show();//line 13
    return;
}

void push(int num){//insert an item

    if(top==MAXSIZE-1)
    {
        printf("Overflow condition");
        return;
    }
    top++;
    stack[top]=num;
    //return;
}

void pop()//delete a item from top
{

    int num;
    if(top==-1)
    {
        printf("Underflow condition");
        return;
    }
    num=stack[top];
    top--;
    //return;
}

void show()//display elements
{

    if(top==-1){
        printf("Underflow");
        return;
    }
    while(top!=-1){
        printf("%d\n",stack[top--]);
    }
    //return;
}

void peep()//extract information
{

    int loc,num;
    printf("enter location:\n");
    scanf("%d",&loc);
    if(top-loc+1 < 0)
    {
        printf("No item at the given location\n");
        return;
    }
    else{
        num=stack[top-loc+1];
        printf("\nItem at location %d is %d",loc,num);
    }
}

void update(){//update information

    int loc,item;
    printf("enter new item:");
    scanf("%d",&item);
    printf("enter location:");
    scanf("%d",&loc);
    if(top-loc+1 < 0)
    {
        printf("No item at the given location\n");
        return;
    }
    else{
        stack[top-loc+1]=item;
        printf("\nItem inserted");
    }
}

在调用show()之后,top将在第8行指向-1(空),因此之后的结果将是:

  • push()将插入位置1而不是顶部。
  • pop()将显示下溢情况。
  • peep()如果有条件,则会更新。

那么在调用show()之后,如何将堆栈顶部设置为堆栈中的顶部元素? 感谢。

3 个答案:

答案 0 :(得分:3)

show函数的一个问题是,它还试图弹出所有数据。您不应该在show函数中执行top--

答案 1 :(得分:3)

您的show()方法会修改top指针,这是错误的:

void show()//display elements
{

    if(top==-1){
        printf("Underflow");
        return;
    }
    while(top!=-1){
        printf("%d\n",stack[top--]); // <--- here 'top--' will modify the top pointer
    }
    //return;
}

您可以像这样更改show()方法:

void show()//display elements
{

    if(top==-1){
        printf("Underflow");
        return;
    }
    int i = top; // introducing a new variable to iterate through the stack
    while(i!=-1){
        printf("%d\n",stack[i--]); // now 'i' is modified
    }
    //return;
}

答案 2 :(得分:0)

// WAP使用C语言执行堆栈操作 1.推,2.pop,3.peep,4.change,5.top-of-stack,6.is-empty,7.is-full,8.display

#include<stdlib.h>

#include<stdio.h>

#define max_size 5

int stack[max_size],top=-1,i,x;
    /*------ Function Prototype------------*/
void push();
void pop();
void peep();
void display();
void top_stack();
void change();
void is_empty();
   /*-------------------------------------*/

  int main()
  {
    int choice;

    do{

        printf("\n\n--------STACK OPERATIONS-----------\n");
        printf("1.Push\n");
        printf("2.Pop\n");
        printf("3.Peep\n");
        printf("4.Display\n");
        printf("5.Change\n");
        printf("6.TOP\n");
        printf("7.exit\n");
        printf("-----------------------");
        printf("\nEnter your choice:\t");
        scanf("%d",&choice);

        switch(choice)
       {
        case 1:    push();
                   break;
        case 2:    pop();
                   break;
        case 3:    peep();
                   break;
        case 4:    display();
                   break;
        case 5:    change();
                   break;
        case 6:    top_stack();
                   break;
        case 7:    exit(0);
                   break;
        default:    printf("\nInvalid choice:\n");
                   break;
        }

     }while(choice!=7);
      return 0;
    }


    void push() //Inserting element in to the stack
    {
      int item;
       if(top==(max_size-1))
        {
            printf("\nStack Overflow:");
        }
       else
        {
          printf("Enter the element to be inserted:\t");
          scanf("%d",&item);
          top=top+1;
          stack[top]=item;
         }
     }

     void pop()      //deleting an element from the stack
    {
      int item;
       if(top==-1)
       {
         printf("Stack Underflow:");
       }
       else
       {
         item=stack[top];
         top=top-1;
         printf("\nThe poped element: %d\t",item);
       }
    }

    void peep()
    {            
       printf("enter the i th element");
       scanf("%d",&i);
       if(top-i+1<0)
       {
         printf("\nStack is empty:");
       }
       else
       {
         printf("The topmost element of the stack is %d",stack[top-i+1]);
       }
    }

    void display()
     {
      int i;
        if(top==-1)
        {
         printf("\nStack is Empty:");
        }
        else
       {
        printf("\nThe stack elements are:\n" );
         for(i=top;i>=0;i--)
         {
          printf("%d\n",stack[i]);
          }
        }
     }


    void change()
    {
      printf("enter the i th element");
      scanf("%d",&i);
        if(top-i+1<0)
        {
         printf("\nStack is empty:");
        }
        else
        {
         printf("enter the element to be changed\n");
         scanf("%d",&x);

         stack[top-i+1]=x ;
         printf("The topmost element of the stack is %d",stack[top-i+1]);
        }

    }
    void top_stack()
    {
    int t;
    t=stack[top];
    printf("The Topmost element of stack is =%d",t);

    }