Sujet: Stockez les deux piles numérotées 0 et 1 dans un espace de tableau d'espace V [m], et le bas de la pile se trouve aux deux extrémités du tableau. Lorsque le pointeur du haut [0] de la pile n ° 0 est -1, la pile est vide, lorsque le pointeur du haut [1] de la pile n ° 1 est m, la pile est vide. Les deux piles se développent des extrémités vers le milieu (comme indiqué dans la figure ci-dessous). Essayez d'écrire les fonctions d'initialisation à double pile, en jugeant la pile vide, la pile pleine, l'empilement, le popping et d'autres algorithmes.
La définition de la structure à double pile est la suivante:
typedef struct{
int top[2],bot[2];//栈顶和栈底指针
SElemType *V;//栈数组
in m;//栈最大可容纳元素的个数(也就是数组长度)
}DblStack;
1. Initialisation de la double pile
Idée: allouez un espace de matrice de taille m pour l'espace de double pile. Les valeurs initiales du pointeur du haut et du pointeur du bas de la pile 0 sont toutes deux -1; les valeurs initiales du pointeur du haut et du pointeur du bas de la pile 1 sont toutes les deux m. Indique que la pile est vide.
algorithme:
Status InitStack(Dblstack &S, int m){
S.V=(SElemType *)malloc(m*sizeof(SElemType)); //为双栈分配一个大小为m的数组空间
if(!S.V){
return ERROR; //存储分配失败
}
S.top[0]=-1;
S.bot[0]=-1;
S.top[1]=m;
S.bot[1]=m;
return OK;
}
2. Déterminez si la pile double est vide:
Idée: Lorsque le pointeur du haut de la pile et le pointeur du bas de la pile de la pile 0 pointent vers la même adresse et que le pointeur du haut de la pile et le pointeur du bas de la pile de la pile 1 pointent également vers la même adresse, le double la pile est vide.
algorithme:
Status DblstackEmpty(Dblstack &S){
if(S.top[0]==S.bot[0]&&S.top[1]==S.bot[1]){
return TRUE; //栈空
}else{
return FALSE; //栈非空
}
}
3. Déterminez si la double pile est pleine.
Idée: Lorsque S.top [0] et S.top [1] sont adjacents, c'est-à-dire S.top [1] -S.top [0] == 1, le la pile est pleine.
algorithme:
Status DblstackFull(Dblstack &S){
if(S.top[1]-S.top[0]==1)
return TRUE; //栈满
else
return FALSE; //栈不满
}
4.
Idée de pile : commencez par juger si la pile double est pleine, si elle est pleine, retournez ERROR; sinon, sauvegardez e1 en haut de pile 0, e2 en haut de pile 1 et le pointeur vers le haut de pile 0 Décalage à droite, le pointeur du haut de la pile 1 se décale vers la gauche. (Déplacer à gauche et à droite est pour l'image ci-dessus)
algorithme:
Status Push(Dblstack &S,int e1,int e2){
if(DblstackFull(S)){ //调用3中的判满函数
return ERROR; //栈满,无法入栈
}
S.V[++S.top[0]]=e1; //e1存到0号栈栈顶,栈顶元素右移
S.V[--S.top[1]]=e2; //e2存到1号栈栈顶,栈顶元素左移
return OK;
}
5.
Idée de pile : juger d'abord si la double pile est vide, si elle est vide, renvoyer ERROR; si elle n'est pas vide, attribuer la valeur de l'élément supérieur de la pile 0 à e1, la valeur de l'élément supérieur de la pile 1 La valeur est affectée à e2, le pointeur en haut de la pile 0 est déplacé vers la gauche et l'élément en haut de la pile 1 est déplacé vers la droite. (Déplacer à gauche et à droite est pour l'image ci-dessus)
algorithme:
Status Pop(Dblstack &S,int e1,int e2){
if(DblstackEmpty(S)){ //调用2中的判空函数
return ERROR; //栈为空,无法出栈
}
e1=S.V[S.top[0]--]; //将0号栈栈顶元素的值赋值给e1,栈顶元素左移
e2=S.V[S.top[1]++]; //将1号栈栈顶元素的值赋值给e2,栈顶元素右移
return OK;
}