栈的数组实现-Ar_Stack-建立自己的c数据结构与算法库系列(8)



/* ADT-头文件:Ar_stack.h*/
/**********************************
*author:Felix
*last update:Thu Jan 10 07:45:50 EST 2008
*description:
*MinStackSize 表示栈的最小值,当调用Ar_CreateStack的参数小于此值则栈的大小取MinStackSize
* AR_STACK_INCREMENT:当栈大小已经不能满足时,栈以此增量扩大栈
*
*/
#ifndef ___AR_STACK___
#define ___AR_STACK___
#include<stdio.h>
#include<stdlib.h>
typedef int Ar_Element;
struct Ar_StackRecord;
typedef struct Ar_StackRecord* Ar_Stack;
int Ar_IsEmpty(Ar_Stack s);
int Ar_IsFull(Ar_Stack s);
Ar_Stack Ar_CreateStack(int MaxElement);
void Ar_MakeEmpty(Ar_Stack s);
void Ar_DisposeStack(Ar_Stack s);
int Ar_Push(Ar_Element e,Ar_Stack s);
void Ar_Pop(Ar_Stack s);
Ar_Element Ar_Top(Ar_Stack s);
Ar_Element Ar_TopAndPop(Ar_Stack s);

#define MinStackSize (5)
#define AR_STACK_INCREMENT (MinStackSize)
#endif


/*实现文件 Ar_stack.c*/
/**********************************
*author:Felix
*last update:Thu Jan 10 07:45:50 EST 2008
*description:
*struct Ar_StackRecord中,
*capacity表示栈申请内存空间的大小
*topOfStack表示栈当前的大小
*array指向一个数组
*/
#include "Ar_stack.h"
struct Ar_StackRecord
{
  int capacity;
  int topOfStack;
  Ar_Element *array;
};
int Ar_IsEmpty(Ar_Stack s)
{
 return  -1==s->topOfStack; 
}
int Ar_IsFull(Ar_Stack s)
{
   return s->capacity==s->topOfStack+1;
}
Ar_Stack Ar_CreateStack(int MaxElement)
{
    MaxElement=MaxElement>5?MaxElement:5;
    Ar_Stack tmp=(Ar_Stack)malloc(sizeof(struct Ar_StackRecord));
    if(tmp==NULL)return NULL;
    tmp->array=(Ar_Element*)malloc(sizeof(Ar_Element)*MaxElement);
    if(tmp->array==NULL){
            free(tmp);
            return NULL;
     }
    tmp->topOfStack=-1;
    tmp->capacity=MaxElement;
    return tmp;
}
void Ar_DisposeStack(Ar_Stack s)
{
  free(s->array);
   free(s);
}

void Ar_MakeEmpty(Ar_Stack s)
{
 s->topOfStack=-1;
 }
int Ar_Push(Ar_Element e,Ar_Stack s)
{
  if(s->topOfStack>=s->capacity-1)
   {
    s->array=(Ar_Element*)realloc(s->array,sizeof(Ar_Element)*(s->capacity+AR_STACK_INCREMENT));
   if(s->array==NULL)
    return 0;
   s->array[++s->topOfStack]=e;
   s->capacity+=AR_STACK_INCREMENT;
   }
  s->array[++s->topOfStack]=e;
  return 1;
}
/*assume that the stack is not empty*/
void Ar_Pop(Ar_Stack s)
{
   s->topOfStack--;
}
/*assume that the stack is not empty*/
Ar_Element Ar_Top(Ar_Stack s)
{
 return s->array[s->topOfStack];
}
Ar_Element Ar_TopAndPop(Ar_Stack s)
{
    return s->array[s->topOfStack--];
}


/***********测试文件*********************/
/***testArStack.c是测试文件,menu_c.h和menu_c.c是菜单实现*/
/* testArStack.c*/
/*///
*author:Felix
*create date:Sun Jan 10 21:11:01 EST 2008
*last update:Sun Jan 10 21:11:01 EST 2008
*description:
*
*
*//
#include "menu_c.h"
#include<stdio.h>
#include<stdlib.h>
#include"Ar_stack.h"
#define TEST_SIZE 5
int main()
{
Ar_Stack sk;
sk=Ar_CreateStack(TEST_SIZE);
int n;
while(SELECT())
{
 switch (SELECTION)
 {
 /*Push an integer to the stack.*/
 case '1':
 printf("input an integer:>");
 if(scanf("%d",&n)>0)Ar_Push(n,sk);
 else printf("illegal input");
 break;
 /*Pop the top*/
 case '2':
 Ar_Pop(sk);
 break;
 /*Show the top*/
 case '3':
  if(Ar_IsEmpty(sk))printf("sorry ,the stack is empty");
else
  printf("%d/n",Ar_Top(sk));
 break;
 /*Pop the stack and show it's elements .*/
 case '4':
  while(!Ar_IsEmpty(sk)){
    printf("%d ",Ar_Top(sk));
    Ar_Pop(sk);
  }
  printf("/n");
 break;
 case '9':
 system("less ../Ar_stack.h");
 break;
 default:break;
 }
}
Ar_DisposeStack(sk);
free(sk);
return 0;
}



/**menu_c.h**/
/*///
*author:Felix
*create date:Sun Jan 6 10:11:01 EST 2008
*last update:Sun Jan 6 10:11:01 EST 2008
*description:
*
*
*/
#include <stdio.h>
#ifndef __MENU____
#define __MENU____
#define SELECT() ((___sel=___select())!='0')
#define SELECTION ___sel
char ___sel;
char ___select();
/*
 define the menu:
*/
#endif


/**menu_c.c*/
/*///
*author:Felix
*create date:Sun Jan 6 10:11:01 EST 2008
*last update:Sun Jan 6 10:11:01 EST 2008
*description:
*
*
*/
#include "menu_c.h"
char *___menu[]={
 
"1.Push an integer to the stack.",
"2.Pop the top",
"3.Show the top",
"4.Pop the stack and show it's elements .", "9.Print the file LS_stack.h",
 
"0.EXIT",
NULL
};
void ___showMenu()
{
 printf("please select:/n");
 char **p=___menu;
 while(*p)printf("%s/n",*p++);
 printf(":>");
}
char ___select()
{
char c;
 ___showMenu();
 while((c=getchar())=='/n');
 return c;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值