该问题描述了一个算法,使用顺序栈的基本运算删除栈中所有值为e的元素。使用C语言
时间: 2024-05-09 13:17:12 浏览: 94
实现这个算法的代码如下:
```c
#include <stdio.h>
#define MAX_SIZE 100
// 定义顺序栈结构体
typedef struct {
int data[MAX_SIZE]; // 数据存储区
int top; // 栈顶指针,初值为-1
} SqStack;
// 初始化栈
void InitStack(SqStack *S) {
S->top = -1;
}
// 判断栈是否为空
int StackEmpty(SqStack S) {
return S.top == -1;
}
// 判断栈是否已满
int StackFull(SqStack S) {
return S.top == MAX_SIZE - 1;
}
// 进栈
int Push(SqStack *S, int x) {
// 判断栈是否已满
if (StackFull(*S)) {
return 0;
}
// 栈顶指针加1
S->top++;
// 将新元素x放入栈顶位置
S->data[S->top] = x;
return 1;
}
// 出栈
int Pop(SqStack *S, int *x) {
// 判断栈是否为空
if (StackEmpty(*S)) {
return 0;
}
// 取出栈顶元素
*x = S->data[S->top];
// 栈顶指针减1
S->top--;
return 1;
}
// 删除栈中所有值为e的元素
void DeleteAll(SqStack *S, int e) {
if (StackEmpty(*S)) {
return;
}
int x;
int i = S->top;
while (i >= 0) {
Pop(S, &x);
if (x != e) {
Push(S, x);
}
i--;
}
}
// 测试主函数
int main() {
SqStack S;
InitStack(&S);
Push(&S, 1);
Push(&S, 2);
Push(&S, 3);
Push(&S, 2);
Push(&S, 4);
printf("Before delete: ");
while (!StackEmpty(S)) {
int x;
Pop(&S, &x);
printf("%d ", x);
}
printf("\n");
InitStack(&S);
Push(&S, 1);
Push(&S, 2);
Push(&S, 3);
Push(&S, 2);
Push(&S, 4);
DeleteAll(&S, 2);
printf("After delete: ");
while (!StackEmpty(S)) {
int x;
Pop(&S, &x);
printf("%d ", x);
}
printf("\n");
return 0;
}
```
该算法的思路是,从栈顶开始遍历栈中的所有元素,若当前元素的值不等于e,则将其压入一个新栈中,最终将新栈中的所有元素重新压回原来的栈中,从而删除所有值为e的元素。
阅读全文