设计一个算法,利用顺序栈的基本运算求栈中从栈顶到栈底的第K个元素,要求仍保持栈中元素不变。c语言
时间: 2024-03-10 13:46:14 浏览: 187
用c语言实现的一个顺序栈
可以使用一个辅助栈来实现该算法。具体步骤如下:
1. 将原栈中的元素依次出栈,并将它们压入辅助栈中,直到原栈为空。
2. 弹出辅助栈中的前K-1个元素,这样栈顶元素即为原栈中从栈顶到栈底的第K个元素。
3. 将弹出的元素重新压入原栈中,以保持栈中元素不变。
以下是对应的 C 语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
} SqStack;
// 初始化栈
void initStack(SqStack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(SqStack *s) {
return s->top == -1;
}
// 入栈
int push(SqStack *s, int x) {
if (s->top == MAXSIZE - 1) {
return 0;
}
s->top++;
s->data[s->top] = x;
return 1;
}
// 出栈
int pop(SqStack *s, int *x) {
if (s->top == -1) {
return 0;
}
*x = s->data[s->top];
s->top--;
return 1;
}
// 获取栈顶元素
int getTop(SqStack *s, int *x) {
if (s->top == -1) {
return 0;
}
*x = s->data[s->top];
return 1;
}
// 求栈中从栈顶到栈底的第K个元素
int getKthElement(SqStack *s, int k) {
SqStack tmp; // 辅助栈
initStack(&tmp); // 初始化辅助栈
int x, count = 0; // count 记录已弹出的元素个数
// 将原栈中的元素依次出栈,并将它们压入辅助栈中
while (!isEmpty(s)) {
pop(s, &x);
push(&tmp, x);
}
// 弹出辅助栈中的前K-1个元素,这样栈顶元素即为原栈中从栈顶到栈底的第K个元素
while (!isEmpty(&tmp) && count < k - 1) {
pop(&tmp, &x);
count++;
}
// 将弹出的元素重新压入原栈中,以保持栈中元素不变
while (!isEmpty(&tmp)) {
pop(&tmp, &x);
push(s, x);
}
return x;
}
int main() {
SqStack s;
initStack(&s);
// 压入一些数据
push(&s, 1);
push(&s, 2);
push(&s, 3);
push(&s, 4);
push(&s, 5);
int k;
printf("请输入需要查找的元素的位置K:");
scanf("%d", &k);
int x = getKthElement(&s, k);
if (x != -1) {
printf("栈中从栈顶到栈底的第%d个元素为:%d\n", k, x);
} else {
printf("输入的K超出了栈的范围!\n");
}
return 0;
}
```
注意:在上述代码中,假设栈中元素为正整数,如果栈中元素为其他类型,需要根据具体情况进行修改。
阅读全文