用C语言编写一个程序,已知一个双向栈S是在同一向量空间内实现的两个栈,它们的栈底分别设在向量空间的两端。试为此双向栈设计初始化InitStack(S),入栈Push(S,i,x),出栈Pop(S,i,x)算法,其中i为0或1,用以表示栈号。
时间: 2024-09-22 19:06:56 浏览: 63
在C语言中,我们可以使用数组实现这种双端栈(也称为“循环队列”),因为数组提供了一种天然的方式,使得栈的两端可以无缝地连接起来。以下是针对这种双端栈的初始化、入栈和出栈操作的算法设计:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 双端栈的最大容量
// 双端栈结构体
typedef struct {
int* data; // 数组存储栈元素
int front[2]; // 前端栈指针,分别对应两个栈
int rear[2]; // 后端栈指针
int top[2]; // 当前栈的栈顶元素下标
int size; // 当前有效栈的大小
} DoublyEndedStack;
// 初始化双端栈
void InitStack(DoublyEndedStack* S) {
S->front[0] = S->front[1] = 0; // 初始化两个栈的前端
S->rear[0] = S->rear[1] = MAX_SIZE - 1; // 初始化两个栈的后端
S->top[0] = S->top[1] = -1; // 表示两个栈都是空的
S->size = 0;
}
// 入栈操作,i=0 或 i=1 分别对应左栈和右栈
void Push(DoublyEndedStack* S, int i, int x) {
if (S->size >= MAX_SIZE) {
printf("Stack overflow.\n");
return;
}
if (i == 0) { // 左栈
if (S->top[0] == -1) { // 非空栈
S->data[S->rear[0] + 1] = x;
S->rear[0]++;
} else { // 空栈
S->front[0] = (S->front[0] + 1) % MAX_SIZE;
S->data[S->front[0]] = x;
}
S->top[0]++;
} else { // 右栈
if (S->top[1] == -1) { // 非空栈
S->data[S->rear[1] - 1] = x;
S->rear[1]--;
} else { // 空栈
S->front[1] = (S->front[1] + 1) % MAX_SIZE;
S->data[S->front[1]] = x;
}
S->top[1]++;
}
S->size++;
}
// 出栈操作,i=0 或 i=1 分别对应左栈和右栈
int Pop(DoublyEndedStack* S, int i, int* x) {
if (S->top[i] == -1) { // 空栈,返回0表示出栈失败
return 0;
}
int result = S->data[(S->front[i] + S->top[i]) % MAX_SIZE];
if (i == 0) { // 左栈
S->rear[0]++;
if (S->rear[0] == S->front[0]) { // 连接处出栈
S->top[0]--;
}
} else { // 右栈
S->front[1]--;
if (S->front[1] == S->rear[1]) { // 连接处出栈
S->top[1]--;
}
}
*x = result;
S->size--;
return 1; // 成功出栈,返回1
}
// 示例主函数
int main() {
DoublyEndedStack stack;
InitStack(&stack);
// 测试 Push 和 Pop 操作...
// ...
return 0;
}
```
阅读全文