Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6350
  • 博文数量: 5
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-01 22:28
文章分类
文章存档

2012年(5)

我的朋友
最近访客

分类: C/C++

2012-12-07 12:44:37

栈是限定尽在表尾进行插入或删除的线性表(先进先出)。对栈来说,表尾称为栈顶,表头称为栈底。
现在以下面的程序说明对栈的基本操作。
#include         
#include
#include           
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 12 
#define ADD 2
typedef struct{
 int *base;
 int *top;
 int stacksize;
}Stack;

int InitStack(Stack *S)                      //初始化
{
 S->base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));
 if(!S->base)
  exit(1);
 S->top=S->base;
 S->stacksize=STACK_INIT_SIZE;
 return OK;
}
int Push(Stack *S,int e)                    //入栈
{
 if(S->top - S->base >= S->stacksize)
 {
  S->base = (int *)realloc(S->base,(S->stacksize+ADD)*sizeof(int));
  if(!S->base) 
   exit(1);
  S->top=S->base+S->stacksize;
  S->stacksize+=ADD;
 }
 *(S->top)++=e;
 return OK;
}

int Pop(Stack *S,int *e)                    //出栈
{
   if(S->top==S->base)
     return ERROR;
   *e=*(--S->top);
   return OK;
}
int visit(int c)
 {
   printf("%d ",c);
   return OK;
 }
int StackTraverse(Stack S,int (*visit)(int))   //遍历
 {
   while(S.top>S.base)
     visit(*S.base++);
   printf("\n");
   return OK;
 }

int StackEmpty(Stack S)                        //判断栈是否为空
 {
   if(S.top == S.base)
     return TRUE;
   else
     return FALSE;
 }
int DestroyStack(Stack *S)                     //销毁栈
 {
   free(S->base);
   S->base=NULL;
   S->top=NULL;
   S->stacksize=0;
   return OK;
 }
int ClearStack(Stack *s)                      //栈置为空 
 {  
   s->top = s->base;
   return OK;
 }
 int StackLength(Stack S)                    //栈的深度
 {
   return (S.top-S.base);
 }
int GetTop(Stack S,int *e)                  //获取栈顶元素
{
 if(S.top==S.base)
  return ERROR;
 *e = *(S.top-1);
 return OK;
}
int main(void)
 {
 int j;
 Stack s;
 int e;
 if(InitStack(&s))                                        //新建
  for(j=0;j<5;j++)
   Push(&s,j);                                          //入栈
 printf("栈中元素依次为:");  
 StackTraverse(s,visit);                                        //第一次遍历
 Pop(&s,&e);                                                    //出栈
 printf("弹出的栈顶元素 e=%d\n",e);
        printf("栈中元素依次为:");
 StackTraverse(s,visit);                                        //次遍历
 
 printf("栈空否:%d (1:空 0:否)\n",StackEmpty(s));              //判断栈是否为空
  
 GetTop(s,&e);
 printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));       //获取栈顶元素,栈的深度
 ClearStack(&s);                                                //清空栈
 printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
 DestroyStack(&s);                                             //销毁栈
 printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
 return 0;
}
 
 
 
 
#include
#include
#include
#define STACK_SIZE 5
#define OK 1
#define ERROR 0
typedef struct  note
{
 int x;
 int y;
}Note;
typedef struct
{
 Note *base;
 Note *top;
 int stack_size;
}Stack;
int init_stack(Stack *p)
{
p->base=malloc(STACK_SIZE * sizeof(struct note));
if(!p->base)
exit(1);
p->top=p->base;
p->stack_size=STACK_SIZE;
return OK;
}
int push(Stack *p,Note e)
{
 if(p->top - p->base >= p->stack_size)
     return ERROR;
 else
 *(p->top)++=e;
 return OK;
}
int Pop(Stack *p,Note *e)                   //出栈
{
   if(p->top==p->base)
     return ERROR;
   *e=*(--p->top);
   return OK;
}

int visit(Note c,Note q)
 {
   if( c.x!=q.x || c.y!=q.y)
   return OK;
   else
   return ERROR;
 }
int stack_traverse(Stack p,int (*visit)(Note, Note),Note q)   //遍历查询
 {
   int flag=1;
   while(p.top > p.base)
   {
    if(0==visit(*p.base++,q))
  return ERROR;
   }
   return OK;
 }

int stack_traverse_print(Stack p)   //遍历打印
 {
   while(p.top>p.base)
   {
    printf("%d %d\n",p.base->x,p.base->y);
    p.base++;
   }
return OK;
 }
int main()
{  
 int x=0,y=0,i=0;
    int flag=1;
 Note q;
 Stack p;
 init_stack(&p);   //栈出始化
 while(flag)
 {
 printf("请输入 X and Y:");
 scanf("%d %d",&x,&y);
        q.x=x;
 q.y=y;
 if(1==stack_traverse(p,visit,q))              //遍历,若栈中已有将加入的数据,则不加入
 {
  if(0==push(&p,q))                          //出栈
  {
   printf("Overflow\n");
   break;
  }
 }
 else
  printf("The Stack already has this element\n");
     printf("是否继续增加元素(flag=1):");
     scanf("%d",&flag);
 }
stack_traverse_print(p);
return 0;
}
阅读(474) | 评论(0) | 转发(0) |
0

上一篇:c语言 链表基本操作

下一篇:没有了

给主人留下些什么吧!~~