mirror of
https://github.com/kangjianwei/Data-Structure.git
synced 2026-02-08 01:22:24 +08:00
163 lines
3.6 KiB
C++
163 lines
3.6 KiB
C++
#include <stdio.h>
|
||
#include "Status.h" //**▲01 绪论**//
|
||
|
||
/* 宏定义 */
|
||
#define N 100 //栈的容量
|
||
|
||
/* 双向栈元素类型定义 */
|
||
typedef int SElemType;
|
||
|
||
/* 双向栈中包含的两个栈的栈名 */
|
||
typedef enum {
|
||
Left, Right
|
||
} StackName;
|
||
|
||
/* 双向栈结构 */
|
||
typedef struct {
|
||
SElemType stack[N]; // 用一个容量足够大的数组做栈
|
||
int top[2]; // 存放栈顶指针
|
||
} TWS;
|
||
|
||
// 初始化栈
|
||
Status Inistack_3_15(TWS* tws);
|
||
|
||
// 入栈,name指示向哪个栈中添加元素
|
||
Status Push_3_15(TWS* tws, StackName name, SElemType x);
|
||
|
||
// 出栈,name指示从哪个栈中移除元素
|
||
Status Pop_3_15(TWS* tws, StackName name, SElemType* x);
|
||
|
||
// 输出栈中元素,name指示输出哪个栈中的元素
|
||
void OutputStack(TWS tws, StackName name);
|
||
|
||
|
||
int main(int argc, char* argv[]) {
|
||
TWS S;
|
||
int i, x;
|
||
|
||
printf("████████ 初始化栈...\n");
|
||
Inistack_3_15(&S);
|
||
|
||
|
||
printf("████████ 向两个栈中压入元素...\n");
|
||
|
||
for(i = 1; i <= 5; i++) {
|
||
Push_3_15(&S, Left, i);
|
||
Push_3_15(&S, Right, 2 * i);
|
||
}
|
||
printf("█ 左栈中的元素(从栈底到栈顶):");
|
||
OutputStack(S, Left);
|
||
printf("█ 右栈中的元素(从栈底到栈顶):");
|
||
OutputStack(S, Right);
|
||
|
||
|
||
printf("████████ 分别弹出两个栈的栈顶元素...\n");
|
||
|
||
Pop_3_15(&S, Left, &x);
|
||
printf("█ 弹出左栈的栈顶元素为:%d\n", x);
|
||
printf("█ 左栈中的元素(从栈底到栈顶):");
|
||
OutputStack(S, Left);
|
||
|
||
Pop_3_15(&S, Right, &x);
|
||
printf("█ 弹出右栈的栈顶元素为:%d\n", x);
|
||
printf("█ 右栈中的元素(从栈底到栈顶):");
|
||
OutputStack(S, Right);
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
// 初始化栈
|
||
Status Inistack_3_15(TWS* tws) {
|
||
if(tws == NULL) {
|
||
return ERROR;
|
||
}
|
||
|
||
(*tws).top[Left] = -1; // 栈0的栈顶指针,注意不是0
|
||
(*tws).top[Right] = N; // 栈1的栈顶指针,注意不是N-1
|
||
|
||
return OK;
|
||
}
|
||
|
||
// 入栈,name指示向哪个栈中添加元素
|
||
Status Push_3_15(TWS* tws, StackName name, SElemType x) {
|
||
if(tws == NULL) {
|
||
return ERROR;
|
||
}
|
||
|
||
// 注意栈满条件,数组全被填充完才算栈满,不浪费空间
|
||
if((*tws).top[Left] + 1 == (*tws).top[Right]) {
|
||
return ERROR;
|
||
}
|
||
|
||
// 先移动栈顶游标,再存入元素
|
||
switch(name) {
|
||
case Left:
|
||
(*tws).top[name]++; // 左边栈的游标向右移动
|
||
break;
|
||
case Right:
|
||
(*tws).top[name]--; // 右边栈的游标向左移动
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
// 存入元素
|
||
(*tws).stack[(*tws).top[name]] = x;
|
||
|
||
return OK;
|
||
}
|
||
|
||
// 出栈,name指示从哪个栈中移除元素
|
||
Status Pop_3_15(TWS* tws, StackName name, SElemType* x) {
|
||
if(tws == NULL) {
|
||
return ERROR;
|
||
}
|
||
|
||
// 先移除元素,再移动游标
|
||
switch(name) {
|
||
case Left:
|
||
// 判断左边的栈是否为空
|
||
if((*tws).top[name] == -1) {
|
||
return ERROR;
|
||
}
|
||
*x = (*tws).stack[(*tws).top[name]];
|
||
(*tws).top[name]--;
|
||
break;
|
||
case Right:
|
||
// 判断右边的栈是否为空
|
||
if((*tws).top[name] == N) {
|
||
return ERROR;
|
||
}
|
||
*x = (*tws).stack[(*tws).top[name]];
|
||
(*tws).top[name]++;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return OK;
|
||
}
|
||
|
||
// 输出栈中元素,name指示输出哪个栈中的元素
|
||
void OutputStack(TWS tws, StackName name) {
|
||
int i;
|
||
|
||
switch(name) {
|
||
case Left:
|
||
for(i = 0; i <= tws.top[name]; i++) {
|
||
printf("%d ", tws.stack[i]);
|
||
}
|
||
break;
|
||
case Right:
|
||
for(i = N - 1; i >= tws.top[name]; i--) {
|
||
printf("%d ", tws.stack[i]);
|
||
}
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
printf("\n");
|
||
}
|