用c语言设计一个算法,利用顺序栈的基本运算删除栈 st 中所有的值为e的元素(这样的元素可能有多个),并且保特其他元素次序不变。并用相关数据进行测试。
时间: 2024-05-05 19:19:15 浏览: 94
用c语言来实现顺序栈
5星 · 资源好评率100%
好的,根据您的要求,我可以提供如下算法:
```
void DeleteValue(SeqStack *st, ElemType e){
int i = 0, k = 0;
ElemType temp;
while(i < st->top){
if(st->data[i] != e){
st->data[k] = st->data[i];
k++;
}
i++;
}
st->top = k;
}
```
算法的思路是:遍历整个栈 st 的元素,将不等于操作数 e 的元素放到前面,等于操作数 e 的元素则不加入新的栈中,从而达到删除的效果。
以下是相关的测试代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct seqstack{
ElemType *data;
int top;
int maxsize;
} SeqStack;
SeqStack* InitStack(int n); //创建栈
int Pop(SeqStack *st); //出栈
void Push(SeqStack *st, ElemType e); //进栈
int StackEmpty(SeqStack *st); //判断栈是否为空
void DeleteValue(SeqStack *st, ElemType e); //删除元素
int main(){
int n, i, value;
ElemType e;
SeqStack *st;
printf("请输入栈的容量:");
scanf("%d", &n);
st = InitStack(n);
printf("请输入栈的元素个数:");
scanf("%d", &value);
printf("请输入栈的元素:");
for(i=0;i<value;i++){
scanf("%d", &e);
Push(st, e);
}
printf("删除前:");
while(!StackEmpty(st)){
printf("%d ", Pop(st));
}
printf("\n请输入要删除的元素:");
scanf("%d", &e);
DeleteValue(st, e);
printf("删除后:");
while(!StackEmpty(st)){
printf("%d ", Pop(st));
}
return 0;
}
SeqStack* InitStack(int n){
SeqStack *st;
st = (SeqStack*)malloc(sizeof(SeqStack));
st->data = (ElemType*)malloc(n * sizeof(ElemType));
st->top = -1;
st->maxsize = n;
return st;
}
int Pop(SeqStack *st){
if(st->top == -1){
printf("栈为空!");
exit(1);
}
st->top--;
return st->data[st->top + 1];
}
void Push(SeqStack *st, ElemType e){
if(st->top == st->maxsize - 1){
printf("栈已满!");
exit(1);
}
st->top++;
st->data[st->top] = e;
}
int StackEmpty(SeqStack *st){
return st->top == -1;
}
void DeleteValue(SeqStack *st, ElemType e){
int i = 0, k = 0;
ElemType temp;
while(i < st->top){
if(st->data[i] != e){
st->data[k] = st->data[i];
k++;
}
i++;
}
st->top = k;
}
```
您可以在程序中对数据进行自定义测试。
阅读全文