作业 一个双向栈S是在同一向量空间内实 现的两个栈,它们的栈底分别设在向量空间 的两端。试为此双向栈设计初始化 InitStack(S),入栈Push(S,i,x),出栈 Pop(S,i,x)算法,其中i为0或1,用以表示栈号
时间: 2024-10-08 12:25:37 浏览: 42
cpp.zip_cpp向量学习_向量实现栈
双向栈(Doubly Linked Stack)是一种特殊的栈数据结构,它允许元素从栈顶和栈底进行插入和删除操作,这就使得数据的添加和移除更加灵活。在C语言中,我们可以使用链表的方式来实现这样的数据结构,其中每个节点包含一个元素值和指向前后节点的指针。
以下是一些基本的初始化、入栈(Push)、和出栈(Pop)算法的设计:
```c
// 双向栈节点定义
typedef struct Node {
int data; // 数据域
struct Node* prev; // 指向前一个节点
struct Node* next; // 指向后一个节点
} Node;
// 初始化双向栈函数
void InitStack(Node** S, int size) {
*S = (Node*)malloc(sizeof(Node) * size); // 分配存储节点的空间
(*S)->prev = NULL;
(*S)->next = NULL; // 栈头和栈尾都是空
}
// 入栈函数,根据i决定入栈的方向
void Push(Node** S, int i, int x) {
if (i == 0) { // 向栈顶入栈
new_node = (Node*)malloc(sizeof(Node)); // 创建新节点
new_node->data = x;
new_node->prev = *S; // 新节点前驱是当前栈顶
new_node->next = *S->next; // 新节点后继是当前下一个节点
(*S)->next->prev = new_node; // 当前下一个节点更新其前驱
*S->next = new_node; // 更新栈顶
} else if (i == 1) { // 向栈底入栈
new_node = (Node*)malloc(sizeof(Node));
new_node->data = x;
new_node->next = *S; // 新节点前驱是栈底
new_node->prev = (*S)->prev; // 新节点后继是当前前一个节点
(*S)->prev->next = new_node; // 当前前一个节点更新其后继
(*S)->prev = new_node; // 更新栈底
}
}
// 出栈函数,同样根据i决定出栈的方向
int Pop(Node** S, int i, int* x) {
if (i == 0) { // 从栈顶出栈
if (*S->next != NULL) { // 判断栈不为空
temp = *S; // 保存要弹出的节点
*S = (*S)->next; // 移动栈顶
free(temp); // 释放栈顶节点
return temp->data; // 返回出栈的数据
} else {
return -1; // 表示栈已空
}
} else if (i == 1) { // 从栈底出栈
if (*S->prev != NULL) { // 判断栈不为空
temp = *S; // 保存要弹出的节点
*S = (*S)->prev; // 移动栈底
free(temp); // 释放栈底节点
return temp->data; // 返回出栈的数据
} else {
return -1; // 表示栈已空
}
}
}
```
阅读全文