/* 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;
}