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]);
}
}