网站推广公司ihanshi,电子商务网站软件建设的核心是什么,中国石油建设工程协会网站,网上注册公司需要多少钱文章目录 一、堆栈1. 定义2. 基本操作 二、顺序栈0. 顺序表1. 头文件和常量2. 栈结构体3. 栈的初始化4. 判断栈是否为空5. 判断栈是否已满6. 入栈7. 出栈8. 查看栈顶元素9. 清空栈10. 主函数11. 代码整合 堆栈Stack 和 队列Queue是两种非常重要的数据结构#xff0c;两者都是特… 文章目录 一、堆栈1. 定义2. 基本操作 二、顺序栈0. 顺序表1. 头文件和常量2. 栈结构体3. 栈的初始化4. 判断栈是否为空5. 判断栈是否已满6. 入栈7. 出栈8. 查看栈顶元素9. 清空栈10. 主函数11. 代码整合 堆栈Stack 和 队列Queue是两种非常重要的数据结构两者都是特殊的线性表 对于堆栈所有的插入和删除以至几乎所有的存取都是在表的同一端进行对于队列所有的插入都是在表的一端进行所有的删除以至几乎所有的存取都是在表的另一端进行。 一、堆栈
1. 定义 堆栈简称栈是一种操作受限的线性表只允许在表的同一端进行插入和删除操作且这些操作是按后进先出的原则进行的。进行插入和删除的一端被称为栈顶另一端被称为栈底。当栈中无元素时称其为空栈。根据上述定义每次删除退栈的总是最后插入进栈的元素。 如图所示的堆栈中诸元素以a1a2a3a4a5的顺序进栈而退栈的次序则是a5a4a3a2a1。 也就是说从栈中取走元素是按后进先出的原则进行的因此栈又被称作后进先出Last in First Out的线性表简称为LIFO表。
2. 基本操作
堆栈是受限的线性表其基本操作包括 push ( ) : 压入一个元素插入pop ( ) : 弹出一个元素删除peek ( ) : 存取栈顶元素值clear ( ) : 清空栈IsEmpty ( ) : 判断栈是否为空 同普通线性表一样堆栈也可以用顺序存储和链接存储两种方式来实现
二、顺序栈 用顺序存储方式实现的堆栈称为顺序栈。
顺序栈用数组存放栈元素可方便地进行各种栈操作某一堆栈的规模指该堆栈最多能容纳的元素个数存放堆栈的数组规模或大小应按堆栈的规模来确定 当堆栈中元素的个数达到堆栈规模简称为栈满时则无法再向堆栈插入元素换言之此时的插入操作将产生上溢出。 如何确保既不上溢也不下溢 需要一个整型变量size来存放数组规模以及一个整型变量top来存放栈顶元素在数组中的位置下标 当栈为空时top值为0每入栈或出栈一个元素top值加1或减1当top等于size时说明栈满
0. 顺序表
参考前文顺序表及其基本操作
1. 头文件和常量 #include stdio.h#include stdlib.h#define MAX_SIZE 100两个头文件 stdio.h用于输入输出操作stdlib.h用于内存分配和释放 通过#define指令定义了一个常量MAX_SIZE它表示栈的最大容量为100。
2. 栈结构体 typedef struct {int data[MAX_SIZE];int top;} Stack;使用结构体定义了一个栈的数据结构data是一个整型数组用于存储栈中的元素top表示栈顶的索引。
3. 栈的初始化 void init(Stack* stack) {stack-top -1;}初始化栈将栈顶索引top置为-1表示栈为空。
4. 判断栈是否为空 int isEmpty(Stack* stack) {return stack-top -1;}判断栈是否为空如果栈顶索引top等于-1表示栈为空函数返回1否则返回0。
5. 判断栈是否已满 int isFull(Stack* stack) {return stack-top MAX_SIZE - 1;}isFull函数用于判断栈是否已满如果栈顶索引top等于MAX_SIZE - 1表示栈已满函数返回1否则返回0。
6. 入栈 void push(Stack* stack, int value) {if (isFull(stack)) {printf(Stack is full. Cannot push element.\n);return;}stack-data[stack-top] value;}push函数用于将元素入栈首先判断栈是否已满如果已满则打印错误信息并返回否则将元素存储在栈顶索引top的位置并将栈顶索引加1。
7. 出栈 int pop(Stack* stack) {if (isEmpty(stack)) {printf(Stack is empty. Cannot pop element.\n);return -1;}return stack-data[stack-top--];}pop函数用于将栈顶元素出栈首先判断栈是否为空如果为空则打印错误信息并返回-1否则返回栈顶元素的值并将栈顶索引减1。
8. 查看栈顶元素 int peek(Stack* stack) {if (isEmpty(stack)) {printf(Stack is empty. Cannot peek element.\n);return -1;}return stack-data[stack-top];}peek函数用于查看栈顶元素的值首先判断栈是否为空如果为空则打印错误信息并返回-1否则返回栈顶元素的值。
9. 清空栈 void clear(Stack* stack) {stack-top -1;}clear函数用于清空栈将栈顶索引top置为-1表示栈为空。
10. 主函数
int main() {Stack stack;init(stack);push(stack, 10);push(stack, 20);push(stack, 30);printf(Top element: %d\n, peek(stack));printf(Popped element: %d\n, pop(stack));printf(Popped element: %d\n, pop(stack));printf(Is stack empty? %s\n, isEmpty(stack) ? Yes : No);clear(stack);printf(Is stack empty? %s\n, isEmpty(stack) ? Yes : No);return 0;
}声明一个Stack类型的变量stack然后调用init函数对栈进行初始化。 使用push函数将元素10、20和30依次入栈。 使用peek函数查看栈顶元素的值。 使用pop函数将栈顶的两个元素出栈。 使用isEmpty函数判断栈是否为空。 调用clear函数清空栈。 再次使用isEmpty函数判断栈是否为空。 11. 代码整合
#include stdio.h
#include stdlib.h#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;
} Stack;void init(Stack* stack) {stack-top -1;
}int isEmpty(Stack* stack) {return stack-top -1;
}int isFull(Stack* stack) {return stack-top MAX_SIZE - 1;
}void push(Stack* stack, int value) {if (isFull(stack)) {printf(Stack is full. Cannot push element.\n);return;}stack-data[stack-top] value;
}int pop(Stack* stack) {if (isEmpty(stack)) {printf(Stack is empty. Cannot pop element.\n);return -1;}return stack-data[stack-top--];
}int peek(Stack* stack) {if (isEmpty(stack)) {printf(Stack is empty. Cannot peek element.\n);return -1;}return stack-data[stack-top];
}void clear(Stack* stack) {stack-top -1;
}int main() {Stack stack;init(stack);push(stack, 10);push(stack, 20);push(stack, 30);printf(Top element: %d\n, peek(stack));printf(Popped element: %d\n, pop(stack));printf(Popped element: %d\n, pop(stack));printf(Is stack empty? %s\n, isEmpty(stack) ? Yes : No);clear(stack);printf(Is stack empty? %s\n, isEmpty(stack) ? Yes : No);return 0;
}