2017-07-18 20 views
0
#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; 
    } 
} 

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

我想使此代码使用较少的内存... 这个代码使用1116KB, 但相同的算法代码使用1000KB。 我怎样才能让这段代码使用更少的内存?

这个代码是这样工作的 -

此代码具有5个命令:

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

2.pop:从栈和打印移除项它。

3.size:打印

4.empty堆叠的元件的数量:堆栈是否为空的,打印1.如果不是打印0

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

步骤

  1. 输入值(repeat循环量)

  2. 输入命令

  3. 利润!

回答

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内存的使用情况。