(1)自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈、出栈、取栈元素基本操作。然后在主程序中对给定的N个数据进行验证,输出各个操作结果 用C写出来
时间: 2024-09-24 15:20:36 浏览: 39
数据结构之链式栈的操作(C语言附详细代码与解释)
首先,让我们创建一个简单的空栈类,采用链表作为存储结构,因为链表适合于动态添加和删除元素。我们将定义一个节点结构体`StackNode`,一个栈类`Stack`,并实现基本的操作:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义栈节点结构体
typedef struct StackNode {
int data;
struct StackNode* next;
} StackNode;
// 栈类
typedef struct {
StackNode* top; // 栈顶指针
int size; // 栈大小
} Stack;
// 初始化一个空栈
Stack* createStack() {
Stack* stack = (Stack*)malloc(sizeof(Stack));
stack->top = NULL;
stack->size = 0;
return stack;
}
// 入栈操作 - 添加元素到栈顶
void push(Stack* stack, int value) {
StackNode* newNode = (StackNode*)malloc(sizeof(StackNode));
newNode->data = value;
newNode->next = stack->top;
stack->top = newNode;
stack->size++;
}
// 出栈操作 - 删除栈顶元素并返回值
int pop(Stack* stack) {
if (stack->top == NULL) {
printf("Error: Stack is empty.\n");
return -1;
}
StackNode* temp = stack->top;
int value = temp->data;
stack->top = stack->top->next;
free(temp);
stack->size--;
return value;
}
// 取栈元素 - 返回栈顶元素,但不删除它
int peek(Stack* stack) {
if (stack->top == NULL) {
printf("Error: Stack is empty.\n");
return -1;
}
return stack->top->data;
}
// 主函数测试
int main(int argc, char *argv[]) {
Stack* myStack = createStack();
int N = 5;
for (int i = 0; i < N; i++) {
printf("Enter number %d to push into the stack: ", i + 1);
int num = scanf("%d", &num);
push(myStack, num);
// 打印栈信息
printf("Top element: %d\n", peek(myStack));
printf("Pop an element: %d\n", pop(myStack));
// 检查栈是否为空
if (myStack->size == 0) {
printf("Stack is empty after popping.\n");
}
}
// 清理内存
free(myStack);
return 0;
}
```
在这个例子中,我们定义了一个空栈类`Stack`,包含`push`、`pop`和`peek`操作。在`main`函数中,用户可以输入N个数字依次进行推入、查看顶部元素和弹出操作,最后会检查栈是否为空。
阅读全文