今日学习了栈的相关操作:
初始化:
define MAX_SIZE 100 // 假设栈的最大容量为 100
typedef struct Stack {
int data[MAX_SIZE];
int top;
} Stack;
// 栈的初始化函数
void initStack(Stack *s) {
s->top = -1;
}
一、增 - 入栈(Push)
入栈操作是向栈顶添加一个新元素,使其成为新的栈顶元素。以顺序栈(基于数组实现)为例,当执行入栈时:
首先需要判断栈是否已满。若栈已满,继续入栈会导致栈溢出错误,此时通常需要给出相应提示信息,告知用户栈空间不足。
若栈未满,将栈顶指针(top)向上移动一位(在基于数组实现且栈顶指针初始化为 -1 的情况下,表现为 top++),使其指向新的栈顶位置。
最后,把要入栈的元素存储到栈顶指针所指向的存储单元,即完成了一个元素的入栈操作。
例如,使用 C 语言代码实现:
define MAX_SIZE 100 // 假设栈的最大容量为 100
typedef struct Stack {
int data[MAX_SIZE];
int top;
} Stack;
void push(Stack *s, int value) {
if (s->top == MAX_SIZE - 1) {
printf("Stack Overflow\n");
return;
}
s->top++;
s->data[s->top] = value;
}
二、删 - 出栈(Pop)
出栈操作是将栈顶元素从栈中移除,并返回被移除的元素值。步骤如下:
先判断栈是否为空。因为空栈没有元素可供移除,若对空栈执行出栈操作,会引发错误,所以要提前检查,若为空栈需给出提示。
若栈非空,取出当前栈顶元素(存储在栈顶指针所指向位置,即 s->data[s->top]),用于后续返回或其他处理。
然后将栈顶指针向下移动一位(在常见实现中表现为 top--),使栈顶指针指向新的栈顶元素,即完成出栈操作。
示例代码:
int pop(Stack *s) {
if (s->top == -1) {
printf("Stack Underflow\n");
return -1;
}
int value = s->data[s->top];
s->top--;
return value;
}
三、改 - 栈内元素修改
栈本身的结构特性决定了它并不像数组等数据结构那样方便直接修改内部任意位置的元素。但在特定场景下,如果要修改栈顶元素,由于栈顶元素可直接访问:
先判断栈是否为空,只有非空栈才有栈顶元素可供修改。
若栈非空,直接对栈顶指针所指向的存储单元进行赋值操作,即可完成栈顶元素的修改。
例如:
void modifyTop(Stack *s, int newValue) {
if (s->top == -1) {
printf("Stack is empty, cannot modify.\n");
return;
}
s->data[s->top] = newValue;
}
不过,一般情况下不会频繁修改栈内元素,因为这可能破坏栈后进先出的逻辑顺序,除非有特殊业务需求。
四、查 - 查找操作
查找栈顶元素:这是最常见的查找操作,由于栈顶元素可直接通过栈顶指针访问,只需判断栈非空后,直接返回栈顶指针所指向的元素值即可。
示例:
int peek(Stack *s) {
if (s->top == -1) {
return -1; // 也可根据实际需求返回其他标识值表示栈空
}
return s->data[s->top];
}
查找特定元素:要在栈中查找是否存在特定值的元素,通常需要从栈顶开始,依次向下遍历栈中的元素,直到找到匹配元素或遍历完整个栈。但这种操作相对不那么符合栈的常规使用场景,因为栈主要用于处理后进先出的顺序问题,频繁查找特定元素会增加时间复杂度,且破坏其操作简洁性。不过在某些调试或特殊需求下可能会用到:
示例代码:
int search(Stack *s, int target) {
int i;
for (i = s->top; i >= 0; i--) {
if (s->data[i] == target) {
return i; // 返回找到元素的位置索引,若为 -1 则表示未找到
}
}
return -1;
}
综上,数据结构栈的增删改查操作各有特点,在实际应用中要依据栈的特性合理运用,避免错误操作,充分发挥栈在处理特定顺序问题上的优势。
标签:总结,12,return,int,18,top,元素,栈顶,Stack From: https://www.cnblogs.com/Genghao11/p/18664514