堆栈(Stack)是一种后进先出(Last-In-First-Out, LIFO)的数据结构,它允许在一端(称为栈顶)进行插入和删除操作。下面是一个简单的堆栈程序示例,使用C语言编写:
```c
include include define MAX_SIZE 10 // 定义堆栈结构 typedef struct { int data[MAX_SIZE]; int top; } Stack; // 初始化堆栈 void initStack(Stack *s) { s->top = -1; } // 判断堆栈是否为空 int isEmpty(Stack *s) { return (s->top == -1); } // 将元素压入堆栈 void push(Stack *s, int value) { if (s->top < MAX_SIZE - 1) { s->data[++(s->top)] = value; } else { printf("Stack is full. Cannot push %d\n", value); } } // 从堆栈中弹出元素 int pop(Stack *s) { if (!isEmpty(s)) { return s->data[(s->top)--]; } else { printf("Stack is empty. Cannot pop.\n"); return -1; // 返回一个错误码 } } // 查看栈顶元素 int peek(Stack *s) { if (!isEmpty(s)) { return s->data[s->top]; } else { printf("Stack is empty. No top element to peek.\n"); return -1; // 返回一个错误码 } } // 销毁堆栈 void destroyStack(Stack *s) { // 释放堆栈占用的内存 free(s); } int main() { Stack stack; initStack(&stack); int choice, value; do { printf("1. Push\n2. Pop\n3. Peek\n4. Is Empty\n5. Is Full\n6. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch (choice) { case 1: printf("Enter value to push: "); scanf("%d", &value); push(&stack, value); break; case 2: value = pop(&stack); if (value != -1) { printf("Popped value: %d\n", value); } break; case 3: value = peek(&stack); if (value != -1) { printf("Top value: %d\n", value); } break; case 4: if (isEmpty(&stack)) { printf("Stack is empty.\n"); } else { printf("Stack is not empty.\n"); } break; case 5: if (isEmpty(&stack)) { printf("Stack is empty.\n"); } else { printf("Stack is full.\n"); } break; case 6: printf("Exiting stack operations.\n"); break; default: printf("Invalid choice. Please try again.\n"); } } while (choice != 6); destroyStack(&stack); return 0; } ``` 这个程序定义了一个堆栈结构,并实现了初始化、压栈、弹栈、查看栈顶元素、判断栈是否为空或已满以及销毁堆栈等基本操作。在`main`函数中,通过一个循环菜单让用户选择执行不同的堆栈操作,直到用户选择退出程序。 请注意,这个示例中的堆栈使用固定大小的数组实现,因此它的大小是有限的。在实际应用中,你可能需要根据需求选择不同的实现方式,例如使用动态数组或链表来实现堆栈,以便能够处理不同大小的输入。