#include<cstdio>
//#define maxlen 1000
//#define elemtype int
//#define ERROR -1e8//typedef struct Stack {
// int top;//记录栈顶位置
// elemtype elem[maxlen];//保存栈元素
//}SqStack;
typedef struct Stack {int top, elem[1000];
}SqStack;
//栈的初始化
void StackInit(SqStack* s) {s->top = -1;
}
//判断栈是否为空
int IsStackEmpty(SqStack* s) {if (s->top == -1)return 1;else return 0;
}
//取栈顶元素
int GetTop(SqStack* s) {if (s->top == -1)return -1e8;else return s->elem[s->top];
}
//进栈
void Push(SqStack* s, int e) {if (s->top == 999)printf("FULL");else {s->top++;s->elem[s->top] = e;}
}
//出栈
int Pop(SqStack* s) {if (s->top == -1) return -1e8;else return s->elem[s->top--];
}
1. 为什么初始化栈顶指针 top
要用 -1,可以用其他的数吗?
top
用来标记栈顶元素的位置。把 top
初始化为 -1 意味着栈为空,因为数组的下标从 0 开始,-1 表明此时栈中没有任何元素。当有元素入栈时,top
会加 1 指向新的栈顶元素。
也可以用其他数来初始化 top
,不过要相应地调整入栈和出栈的逻辑。例如,若把 top
初始化为 0,那么入栈时就不需要先对 top
加 1,出栈时也不需要先减 1。但,这样做会让代码逻辑变得复杂,而且 -1 是表示空栈的一种标准做法。
2. 为什么出栈和取栈顶元素时返回 -1e8,可以是其他的数吗?
在出栈和取栈顶元素的操作中,当栈为空时,代码返回 -1e8 来表示操作失败。这里的 -1e8 是一个比较特殊的值,一般情况下栈中的元素不会是这个值,所以可以用它来作为错误标志。
可以使用其他数来替代 -1e8,只要这个数不会作为正常的栈元素出现就行。例如,可以用一个不会出现的特殊值,或使用一个枚举类型来表示错误状态。
3. 栈和数组有什么区别,不是还要靠数组来模拟栈吗,然后自己写一些条件来模仿栈的功能?
栈和数组是不同的数据结构,它们的区别:
- 概念层面:
- 数组:是一种线性数据结构,用于存储一组相同类型的元素。它可以通过下标随机访问任意位置的元素。
- 栈:是一种特殊的线性数据结构,遵循后进先出(LIFO)的原则。只能在栈顶进行插入(入栈)和删除(出栈)操作。
- 操作层面:
- 数组:支持随机访问,可以在任意位置插入和删除元素,但插入和删除操作可能需要移动大量元素,时间复杂度较高。
- 栈:只支持在栈顶进行插入和删除操作,时间复杂度为 O (1)。
虽然可以用数组来模拟栈的功能,但这并不意味着栈和数组是一样的。使用数组模拟栈是为了在没有内置栈数据结构的情况下实现栈的功能,通过添加一些条件来限制对数组的访问,使其符合栈的特性。
枚举类型来列举错误
#include <cstdio>
#define maxlen 1000
#define elemtype int // 定义错误状态
typedef enum {SUCCESS = 0,ERROR = -1
} Status;typedef struct Stack {int top;elemtype elem[maxlen];
} SqStack;// 栈的初始化
void StackInit(SqStack* s) {s->top = -1;
}// 判断栈是否为空
int IsStackEmpty(SqStack* s) {return s->top == -1;
}// 取栈顶元素
Status GetTop(SqStack* s, elemtype* e) {if (IsStackEmpty(s)) {return ERROR;}*e = s->elem[s->top];return SUCCESS;
}// 进栈
void Push(SqStack* s, elemtype e) {if (s->top == maxlen - 1) {printf("FULL\n");} else {s->top++;s->elem[s->top] = e;}
}// 出栈
Status Pop(SqStack* s, elemtype* e) {if (IsStackEmpty(s)) {return ERROR;}*e = s->elem[s->top--];return SUCCESS;
}