数组和链表其实都能很好的完成这项任务,唯一不同就是,仿真入栈操作时,数组必须提前给出栈的大小,而链表可以使栈的大小实现动态变化,节省内存...

 其实也就是数组和链表本身的区别了:

数组: 优点:查找速度快
        缺点:大小固定,不适合动态存储,不方便动态添加。 
    链表:与数组相反。优缺点互换。

再详细点可以从下面两个方面说: 

1、从逻辑结构来看
  数组必须事先定义元素个数,不能适应数据动态地增减的情况,当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费。
  
   链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项,而数组比较麻烦的...  
  
2、 从内存存储来看  
  (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
  
  链表从堆中分配空间, 自由度大但是申请管理比较麻烦.
数组中的数据在内存中的按顺序存储的,而链表是随机存储的!
  要访问数组中的元素可以按下标索引来访问,速度比较快。  
    要访问链表中的某个元素的话,那就得从链表的头逐个遍历,直到找到所需要的元素为止,所以链表的随机访问的效率就比数组要低
  
  数组在内存中开辟连续的一块区域,如果一个数据要两个内存单元,一组5个数据10个单元就够了,无需标记其地址,因为数组定义时候标顶了第一个原许的地址,其他四个都知道了。
  链表可以是连续的,也可以是不连续的,但一般都是不连续的,尽管在内存中是连续的,我们把他当作是不连续的,因为如果把他当作是连续的,不如当作是数组了,在某些情况下。一链5个数据,如果每个数据本身用2个内存单元,那么10个单元是不够的,因为每个数据都要表示出下个数据在哪里,所以一个数据本身用2个单元,再用1个单元表示此链下一个数据在什么地址
 

代码如下:

数组仿真堆栈:

#include <stdio.h>

#define MaxSize 10
int stack[MaxSize];
int top = -1;

void push(int value)
{
 int i;
 if(top >= MaxSize)
 {
  printf("\nthe stack is full!!\n");
 }
 else
 {
  printf("\nthe stack content before(top->bottom):");
  for(i = top; i >= 0; i--)
  {
   printf("[%d]",stack[i]);
  }
  top++;
  stack[top] = value;
  
  printf("\nthe stack content after push(top->bottom):");
  for(i = top; i >= 0; i--)
  {
   printf("[%d]",stack[i]);
  }
  printf("\n");
 }
}

int pop()
{
 int temp;
 int i;
 
 if(top < 0)
 {
  printf("\nthe stack is empty!!!\n");
  return -1;
 }
 
 printf("\nthe stack content before(top->bottom):");
 for(i = top; i >= 0; i--)
 {
  printf("[%d]",stack[i]);
 }
 temp = stack[top];
 top--;
 printf("\nthe pop value is [%d]",temp);
 
 printf("\nthe stack content after push(top->bottom):");
 for(i = top; i >= 0; i--)
 {
  printf("[%d]",stack[i]);
 }
 printf("\n");
 
 return temp;
}

int main()
{
 int select;
 int value;
 
 printf("\n(1)Input a stack data");
 printf("\n(2)Onput a stack data");
 printf("\n(3)Exit");
 
 printf("\nplease select one =>");
 scanf("%d",&select);
 
 do
 {
  switch(select)
  {
  case 1:
   printf("please input the data =>");
   scanf("%d",&value);
   push(value);
   break;
  case 2:
   value = pop();
   break;
  }
  
  printf("\n(1)Input a stack data");
  printf("\n(2)Onput a stack data");
  printf("\n(3)Exit");
  
  printf("\nplease select one =>");
  scanf("%d",&select);
  printf("\n");
 }while(select!=3);
 
 return 0;
}

链表仿真堆栈:

#include <stdio.h>

struct node
{
 int data;
 struct node *next;
};

typedef struct node list;
typedef list *link;
link stack = NULL;

void print_stack()
{
 link temp = NULL;
 temp = stack;
 if(temp == NULL)
 {
  printf("the stack is empty!!\n");
 }
 else
 {
  while(temp != NULL)
  {
   printf("[%d]", temp-> data);
   temp = temp -> next;
  }
  printf("\n");
 }
}

void push(int value)
{
 link newnode;
 printf("\nthe stack content before(top -> bottom):");
 print_stack();
 newnode = (link)malloc(sizeof(list));
 newnode -> data = value;
 newnode -> next = stack;
 stack = newnode;
}

int pop()
{
 link top;
 int temp;
 printf("\nthe stack content before(top -> bottom):");
 print_stack();
 if(stack != NULL)
 {
  top = stack;
  stack = stack -> next;
  temp = top -> data;
  free(top);
  return temp;
 }
 else
  return -1;
}

int main()
{
 link point;
 int select;
 int i, value;
 
 printf("\n(1)Input a stack data");
 printf("\n(2)Onput a stack data");
 printf("\n(3)Exit");
 
 printf("\nplease select one =>");
 scanf("%d",&select);
 
 do
 {
  switch(select)
  {
  case 1:
   printf("please input the data =>");
   scanf("%d",&value);
   push(value);
   printf("\nthe stack content current(top -> bottom):");
   print_stack();
   break;
  case 2:
   value = pop();
   printf("\nthe output value is (%d)", value);
   printf("\n");
   printf("\nthe stack content current(top -> bottom):");
   print_stack();
   break;
  } 
  printf("\n(1)Input a stack data");
  printf("\n(2)Onput a stack data");
  printf("\n(3)Exit");
  
  printf("\nplease select one =>");
  scanf("%d",&select);
 // printf("\n");
 }while(select!=3); 
 return 0;
}