复习(数据结构):栈:c语言:练习题

共享空间的两栈

#include <stdio.h>
#include <stdlib.h>

#define  Error(Str) FatalError(Str)
#define  FatalError(Str) fprintf(stderr,"%s\n",Str),exit(1)


#define  EmptyPos  (-1)
#define  MiStackSize (5)
#define  StackIncrement  (2)
#define  MAXSIZE 20
#define  OK 1
#define  ERROR 0
#define  TRUE 1
#define  FALSE 0;

typedef int SElemType;
typedef int Status;

typedef struct{
    SElemType  data[MAXSIZE];
     int  top1;
     int  top2;
}SqDoubleSatck;

Status visit(SElemType c){
    printf("%d ",c);
    return OK;
}

//

Status InitStack(SqDoubleSatck *s){
    s->top1=-1;
    s->top2=MAXSIZE;
    return OK;
}

// s设置为空
 Status ClearStack(SqDoubleSatck* s){
    s->top1=-1;
    s->top2=MAXSIZE;
    return OK;
}
// 是空,返回true,否则,false
  Status StackEmpty(SqDoubleSatck s){
    if(s.top1==-1 && s.top2==MAXSIZE)
        return TRUE;
    else
        return FALSE;
}
int StackLength(SqDoubleSatck s){
    return (s.top1+1)+(MAXSIZE-s.top2);
}

Status Push(SqDoubleSatck *s,SElemType e,int stackNumber){
    if(s->top1==s->top2)  // 栈满
        return ERROR;
    if(stackNumber==1)  // 栈1,进栈
      s->data[++s->top1]=e; // 先top1+1,然后元素 赋值
    else if(stackNumber==2)
        s->data[--s->top2]=e;  // 先top2-1,然后元素,赋值
    return OK;
}

 Status Pop(SqDoubleSatck *s,SElemType *e,int stackNumber){
     if(stackNumber==1){
         if(s->top1==-1)
             return ERROR; //栈1是空栈
         *e=s->data[s->top1--];  //栈1的栈顶 元素出栈
     }else  if(stackNumber==2){
         if(s->top2==MAXSIZE)
             return ERROR;
         *e=s->data[s->top2++];
     }

     return OK;
 }

Status StackTraverse(SqDoubleSatck s){
    int i=0;
    while(i<s.top1)
        visit(s.data[i++]);
    i=s.top2;
    while(i<MAXSIZE)
        visit(s.data[i++]);
    printf("\n");
    return OK;
}

int main(){
    int j;
    SqDoubleSatck s;
    int e;
    if(InitStack(&s)==OK){
        for(j=1;j<=5;j++)
            Push(&s,j,1);
        for(j=MAXSIZE;j>=MAXSIZE-2;j--)
            Push(&s,j,2);
    }
    Pop(&s,&e,2);


    return 0;
}

递归和栈


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值