编写双栈初始化,判断栈空、栈满、进栈和出 栈等算法的函数将编号为0和1的两个栈存放于一个数组空间v[m]中,栈底分别处 千数组的两端。当第0号栈的栈顶指针 top[0] 等于-1 时该栈为 空;当第1号栈的栈顶指针 top[1]等于m时,该栈为空。两个栈均 从两端向中间增长(如图)。试编写双栈初始化,判断栈空、栈满、进栈 和出栈等算法的函数。C语言编写
时间: 2025-06-26 13:02:44 浏览: 14
以下是基于您描述的需求所设计的双栈操作相关的 C 语言代码及说明:
---
### 双栈结构体定义
```c
#define MAX_SIZE 10 // 定义数组的最大容量 m
typedef struct {
int v[MAX_SIZE]; // 存放数据的数组
int top[2]; // 分别记录两个栈的栈顶位置
} DoubleStack;
```
- `top[0]` 表示第一个栈 (编号为0) 的栈顶指针。
- `top[1]` 表示第二个栈 (编号为1) 的栈顶指针。
初始状态下:
- 第一个栈 (`top[0]=-1`) 表示为空;
- 第二个栈 (`top[1]=MAX_SIZE`) 表示为空。
---
### 初始化函数
```c
void init(DoubleStack *stack) {
stack->top[0] = -1; // 初始时,栈0为空
stack->top[1] = MAX_SIZE; // 初始时,栈1为空
}
```
**功能**: 将两个栈初始化为空状态。
---
### 判断栈是否为空
```c
int isEmpty(DoubleStack *stack, int sNum) {
if(sNum == 0){
return stack->top[0] == -1 ? 1 : 0; // 如果栈0的top[0]==-1,则栈空
}else{
return stack->top[1] == MAX_SIZE ? 1 : 0; // 如果栈1的top[1]==m,则栈空
}
}
```
**功能**: 检查指定编号的栈(sNum=0 或者 sNum=1)是否为空。返回值为 1 表示空,0 表示非空。
---
### 判断栈是否已满
由于两个栈共享同一个数组空间 `[0...MAX_SIZE-1]` ,所以当两者相碰即表示栈满:
```c
int isFull(DoubleStack *stack) {
return stack->top[0] + 1 >= stack->top[1];
}
```
**功能**: 当前两个栈的空间已经全部占用时返回真(`1`),否则假(`0`)。
---
### 进栈操作
```c
int push(DoubleStack *stack, int sNum, int value) {
if(isFull(stack)) {
printf("Error: Stack Overflow!\n");
return 0;
}
if(sNum == 0){
stack->v[++(stack->top[0])] = value; // 先递增再赋值给新元素地址
} else{
stack->v[--(stack->top[1])] = value; // 先递减再赋值给新元素地址
}
return 1;
}
```
**功能**: 向指定编号的栈插入一个新的整数值value 。如果成功则返回 `1`, 否则返回 `0`.
---
### 出栈操作
```c
int pop(DoubleStack *stack, int sNum) {
if(isEmpty(stack,sNum)){
printf("Error: Stack Underflow!\n");
return NULL;
}
if(sNum == 0){
return stack->v[(stack->top[0])--]; // 返回当前栈顶,并将top减一
}else{
return stack->v[(stack->top[1])++]; // 返回当前栈顶,并将top加一
}
}
```
**功能**: 移除并返回对应栈顶部的数据项。若失败(例如尝试对空栈执行pop),打印错误信息并返回NULL.
---
### 示例完整程序
这里提供完整的测试案例演示上述所有基本方法的功能实现情况:
```c
#include <stdio.h>
// 上述的所有函数和定义在此省略...
int main(){
DoubleStack myDoubleStack;
init(&myDoubleStack);
for(int i=1;i<=5;i++)push(&myDoubleStack ,0,i); // 向栈0压入五个数
for(char ch='A';ch<='E';ch++)push(&myDoubleStack ,1,ch); // 向栈1压入字符 A~E
while(!isEmpty(&myDoubleStack,0))
printf("%d ", pop(&myDoubleStack,0)); // 输出应该是依次弹出数字序列
putchar('\n');
while(!isEmpty(&myDoubleStack,1))
printf("%c ", pop(&myDoubleStack,1)); // 输出应依次是 E D C B A
return 0;
}
```
输出结果应该像这样:
```
5 4 3 2 1
E D C B A
```
---
阅读全文
相关推荐


















