共享栈的实现以及基本功能

1、共享栈的实现以及基本功能



/**
 *   共享栈的实现以及基本功能
 *   共享栈主要是为了节约内存,但是我们一般只用两个栈共享,多的话其实用的比较多的是链式共享栈,下节我们讲
 *
 */

#include <stdio.h>
#include <mm_malloc.h>

#define MAXSIZE 50
#define OK 1
#define ERROR -1

typedef struct DqStack{

    char elem[MAXSIZE];
    int top[];  // top[0]、top[1]分别代表着两个不同的栈的“指针”

}DqStack,*Dq;


int main(){

    Dq init();
    int push(Dq s,int x,char value);
    int pop(Dq s,int x,char *value);
    int getValue(Dq s,int x,char *value);
    void display(Dq s);

    Dq s = init();
    int value = 0;
    push(s,0,'1');
    push(s,0,'2');
    push(s,0,'3');
    push(s,0,'4');

    pop(s,0,&value);
    printf("出栈的值:%c\n",value);

    push(s,1,'a');
    push(s,1,'b');
    push(s,1,'c');
    push(s,1,'d');

    pop(s,1,&value);
    printf("出栈的值:%c\n",value);
    display(s);
}
 //初始化共享栈
  Dq init(){

         Dq s = (DqStack *)malloc(sizeof( DqStack));
         s->top[0] = -1;
         s->top[1] = MAXSIZE;
      return s;


}

//压栈  x = 0,表示插入到左边的栈, x = 1,表示插入到右边的栈
  int push(Dq s,int x,char value){

      if ((s->top[0]+1) == s->top[1]){
                  printf("栈已满!\n");
      }

    switch (x) {

          case 0:
              s->top[0]++;
              s->elem[s->top[0]] = value;
                break;
          case 1:
              s->top[1]--;
              s->elem[s->top[1]] = value;
              break;
          default:
              return ERROR;
              break;
    }
    return OK;
      }

//弹栈  x = 0,表示插入到左边的栈, x = 1,表示插入到右边的栈  value记录要出栈的值
int pop(Dq s,int x,char *value){

    switch (x) {

        case 0:
            if (s->top[0] == -1){
                 printf("左边的栈已满\n");
                return ERROR;
            }
           *value = s->elem[s->top[0]];
            s->top[0]--;
            break;
        case 1:
            if (s->top[0] == -1){
                printf("右边的栈已满\n");
                return ERROR;
            }

            *value = s->elem[s->top[1]];
            s->top[1]++;
            break;
        default:
            return  ERROR;
            break;

    }
    return OK;

}

//得到栈顶元素
//弹栈  x = 0,表示插入到左边的栈, x = 1,表示插入到右边的栈  value记录要出栈的值
int getValue(Dq s,int x,char *value){

    switch (x) {

        case 0:
            *value = s->elem[s->top[0]];
            break;
        case 1:
            *value = s->elem[s->top[1]];
            break;
        default:
            break;
    }

}

//遍历
void display(Dq s){
    for (int i = 0; i <= s->top[0]; ++i) {
           printf("%c\t",s->elem[i]);
    }

     printf("\n");

    for (int i = MAXSIZE-1; i >= s->top[1]; i--) {
        printf("%c\t",s->elem[i]);
    }
}


上一篇:DataGuard主备归档存在gap的处理办法


下一篇:C语言顺序表的增删改源码