c数据结构 -- 栈

221 阅读3分钟

1. 栈中的方法及实现思路

  1. initStack(Stack *stack): 初始化栈函数用于将栈的顶部指针 top 设置为初始值-1,表示空栈。
  2. isEmpty(Stack *stack): 检查栈是否为空函数通过判断栈的顶部指针 top 是否等于-1来确定栈是否为空。若 top 等于-1,则返回1表示栈为空,否则返回0表示栈非空。
  3. isFull(Stack *stack): 检查栈是否已满函数通过判断栈的顶部指针 top 是否达到数组最大索引(MAX_SIZE-1)来确定栈是否已满。若 top 等于MAX_SIZE-1,则返回1表示栈已满,否则返回0表示栈未满。
  4. push(Stack *stack, int item): 入栈函数用于将元素压入栈中。首先检查栈是否已满,如果已满则打印错误信息并返回。如果栈未满,将栈顶指针 top 加1,然后将元素放入 data 数组的相应位置。
  5. pop(Stack *stack): 出栈函数用于从栈中弹出元素。首先检查栈是否为空,如果为空则打印错误信息并返回适当的错误值。如果栈非空,返回栈顶元素的值,并将栈顶指针 top 减1,表示删除了栈顶元素。
  6. top(Stack *stack): 获取栈顶元素函数用于返回栈顶元素的值,而不修改栈结构。首先检查栈是否为空,如果为空则打印错误信息并返回适当的错误值。如果栈非空,则直接返回栈顶元素的值,不修改栈顶指针 top

2. 代码展示

#include <stdio.h>  
#define MAX_SIZE 100  
  
typedef struct {  
    int data[MAX_SIZE];  
    int top;  
} Stack;  
  
// 初始化栈  
void initStack(Stack *stack) {  
    stack->top = -1; // 将栈顶指针设置为-1,表示空栈  
}  
  
// 检查栈是否为空  
int isEmpty(Stack *stack) {  
    return (stack->top == -1); // 如果栈顶指针为-1,则栈为空,返回1;否则返回0  
}  
  
// 检查栈是否已满  
int isFull(Stack *stack) {  
    return (stack->top == MAX_SIZE - 1); // 如果栈顶指针等于数组最大索引(MAX_SIZE-1),则栈已满,返回1;否则返回0  
}  
  
// 入栈  
void push(Stack *stack, int item) {  
    if (isFull(stack)) { // 如果栈已满,则无法入栈,打印错误信息并返回  
        printf("Error: Stack overflow\n");  
        return;  
    }  
    stack->data[++(stack->top)] = item; // 栈顶指针加1,并将元素放入栈顶位置  
}  
  
// 出栈  
int pop(Stack *stack) {  
    if (isEmpty(stack)) { // 如果栈为空,则无法出栈,打印错误信息并返回一个适当的错误值  
        printf("Error: Stack underflow\n");  
        return -1; // 或者返回其他适当的错误值  
    }  
    return stack->data[(stack->top)--]; // 返回栈顶元素,并将栈顶指针减1  
}  
  
// 获取栈顶元素  
int top(Stack *stack) {  
    if (isEmpty(stack)) { // 如果栈为空,则无法获取栈顶元素,打印错误信息并返回一个适当的错误值  
        printf("Error: Stack is empty\n");  
        return -1; // 或者返回其他适当的错误值  
    }  
    return stack->data[stack->top]; // 返回栈顶元素的值,不修改栈顶指针  
}  
  
int main() {  
    Stack stack;  
    initStack(&stack); // 初始化栈  
  
    push(&stack, 10); // 入栈元素10  
    push(&stack, 20); // 入栈元素20  
    push(&stack, 30); // 入栈元素30  
  
    printf("Top element: %d\n", top(&stack)); // 30  
  
    printf("Popped element: %d\n", pop(&stack)); // 30  
    printf("Popped element: %d\n", pop(&stack)); // 20  
  
    printf("Top element: %d\n", top(&stack)); // 10  
    getchar();  
    return 0;  
}