如何使这个堆栈代码使用更少的内存? (C朗)

时间:2017-07-18 11:07:50

标签: memory stack clang

#include<stdio.h>

int tp=-1;

void push(int arr[],int value)
{
    arr[++tp]=value;
}

void pop(int arr[])
{
    if(size()==0)
    {
        puts("-1");
        return;
    }
    printf("%d\n",arr[tp--]);
}

int size()
{
    return tp+1;
}

void empty()
{
    if(size()==0)puts("1");
    else puts("0");
}

int top(int arr[])
{
    if(size()==0)
    {
        puts("-1");
        return;
    }   
    printf("%d\n",arr[tp]);
}

int main()
{
    int arr[10000];
    unsigned int i,repeat;
    char command[6];

    scanf("%d",&repeat);                //repeating
    for(i=0;i<repeat;i++)
    {
    scanf("%s",command);
    switch(command[0])
    {
        case 'p':
            if(command[1]=='u')         //push
            {
                int value;
                scanf("%d",&value);
                push(arr,value);
            }
            else pop(arr);              //pop. if stack is empty, output -1
            break;
        case 's':
            printf("%d\n",size());      //print size of stack
            break;
        case 'e':
            empty();                    //if stack is empty, print 1. if not, print 0.
            break;
        case 't':
            top(arr);                   //print value that is on top of stack. if stack is empty, print -1
            break;
    }
}

}

我想让这段代码使用更少的内存...... 此代码使用1116KB, 但具有相同算法的代码使用1000KB。 如何让这段代码使用更少的内存?

此代码的工作方式如下 -

此代码有5个命令:

1.push X:在堆栈中添加X

2.pop:从堆栈中删除一个项目并打印出来。

3.size:打印堆栈元素的数量

4.empty:如果此堆栈为空,则打印1.如果不打印0

5.top:打印堆栈顶部的项目

步骤

  1. 输入值(重复循环量)

  2. 输入命令

  3. 利润!!

1 个答案:

答案 0 :(得分:0)

此问题可以有多种解决方案。因为,您使用静态数组和顶部变量来跟踪堆栈的最后一个元素,最终会得到与算法相同的空间复杂度,因为每次数组的大小都保持不变。

因此,您应该在向堆栈添加任何元素时使用动态内存分配,这是指在C中使用malloc或calloc函数,以便在每次添加位置时从堆中分配内存。而使用自由函数来弹出一个元素和分配给它的空闲内存。

以下是使用链接列表实现堆栈的代码:

#include<stdio.h>

struct Node
{
   int data;
   struct Node *next;
}*top = NULL;

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

void main()
{
   int choice, value;
   printf("1. Push\n2. Pop\n3. Display\n4. Exit\n");
   while(1){
      printf("Enter your choice: ");
      scanf("%d",&choice);
      switch(choice){
     case 1: printf("\nEnter value to insert: ");
         scanf("%d", &value);
         push(value);
         break;
     case 2: pop(); break;
     case 3: display(); break;
     case 4: exit(0);
     default: printf("\nWrong selection!!! \n");
      }
   }
}
void push(int value)
{
   struct Node *newNode;
   newNode = (struct Node*)malloc(sizeof(struct Node));
   newNode->data = value;
   if(top == NULL)
      newNode->next = NULL;
   else
      newNode->next = top;
   top = newNode;
   printf("\nInsertion is Success!!!\n");
}
void pop()
{
   if(top == NULL)
      printf("\nStack is Empty!!!\n");
   else{
      struct Node *temp = top;
      printf("\nDeleted element: %d", temp->data);
      top = temp->next;
      free(temp);
   }
}
void display()
{
   if(top == NULL)
      printf("\nStack is Empty!!!\n");
   else{
      struct Node *temp = top;
      while(temp->next != NULL){
     printf("%d--->",temp->data);
     temp = temp -> next;
      }
      printf("%d",temp->data);
   }
}   

您还可以使用9432 KB验证codechef's online IDE内存的使用情况。