一、实验目的:
1、理解栈的定义;
2、利用栈处理实际问题。
二、实验内容(实验题目与说明)
利用栈实现数据的分类,将输入的整数以奇偶为标准分别存放到两个栈中,并最终从栈1和栈2输出偶数和奇数序列。
三、算法设计(核心代码或全部代码)
#include <stdio.h>
#include <stdlib.h>
#define max 100 // 栈最大容量
typedef struct Stack {
????int data[max];
????int top;
} Stack;
// 将栈顶指针设为-1,表示栈为空
void initStack(Stack *s) {
????s->top = -1;
}
// 栈是否为空
int isEmpty(Stack *s) {
????return s->top == -1;
}
// 栈是否已满
int isFull(Stack *s) {
????return s->top == max - 1;
}
// 入栈
void push(Stack *s, int x) {
????if (isFull(s)) {
????????printf("Stack is full\n");
????????return;
????}
????s->data[++(s->top)] = x;
}
// 出栈
int pop(Stack *s) {
????if (isEmpty(s)) {
????????printf("Stack is empty\n");
????????return -1;
????}
????return s->data[(s->top)--];
}
// 获取栈顶元素
int peek(Stack *s) {
????if (isEmpty(s)) {
????????printf("Error: Stack is empty\n");
????????return -1;
????}
????return s->data[s->top];
}
// 分类函数
void classify(Stack *s1, Stack *s2) {
????int x;
????printf("请输入一组整数,以0结束输入:\n");
????scanf("%d", &x);
????while (x != 0) {
????????if (x % 2 == 0) {
????????????push(s1, x); // 偶数入栈s1
????????} else {
????????????push(s2, x); // 奇数入栈s2
????????}
????????scanf("%d", &x); // 继续输入下一个整数
????}
}
// 输出函数
void output(Stack *s1, Stack *s2) {
????printf("偶数序列为:");
????while (!isEmpty(s1)) {
????????printf("%d ", pop(s1)); // 从s1中依次弹出偶数
????}
????printf("\n奇数序列为:");
????while (!isEmpty(s2)) {
????????printf("%d ", pop(s2)); // 从s2中依次弹出奇数
????}
????printf("\n");
}
int main() {
????Stack s1, s2;
????initStack(&s1);
????initStack(&s2);
????classify(&s1, &s2);
????output(&s1, &s2);
????return 0;
}
使用栈时,可能会遇到栈溢出或栈下溢的问题。栈溢出指尝试将数据推入一个已满的栈时发生的错误。为了避免栈溢出,在推入和弹出元素之前先检查栈是否已满。栈下溢则是指尝试从一个空栈中弹出数据时发生的错误。为了避免栈下溢,需要在弹出元素之前检查栈是否为空。另外需要确保正确地操作栈顶指针和数据存放顺序
通过编写这段代码,我更深入地理解了栈的基本概念和操作,熟悉栈的应用场景。栈是一种后进先出的数据结构,只能在栈顶进行插入和删除操作。将一组整数按照奇偶性分类存储到两个不同的栈中,并按照出栈的顺序输出分类结果。这是栈的一个常见应用场景。通过这个实验,我更清楚地认识到栈在问题解决中的作用。