1.栈的概念 first int last out
栈是一种数据逻辑结构,要求先进后出(FILO)
只要符合先进后出的逻辑,那么这种数据结构就叫做栈
栈顶:数据保存到栈里面(入栈)以及出栈操作都必须从栈顶位置开始
栈底:整个栈最开始的位置
2.如何表示栈--》stack
写法一:用顺序表来表示栈 --》顺序栈
struct 顺序栈的名字
{
//数组存放真实数据
int buf[50];
//定义变量标记栈顶位置
int top;
//定义变量标记栈底位置(可选的,可写可不写)
int bottom;
}
写法二:用单链表表示栈 --》链式栈
struct 链式栈的名字
{
//存放真实数据
int data;
//指向栈顶位置的指针
struct 链式栈的名字 *top;
//指向下一个结点的指针
struct 链式栈的名字 *next;
3.顺序栈的实现
栈的初始化
入栈(压栈) --》就是把数据存放到栈里面
出栈(弹栈) --》把数据从栈中取出来,删除
4.链式栈的实现
顺序栈的实现
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// 定义顺序栈结构
typedef struct {
int data[MAX_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack *s) {
return s->top == MAX_SIZE - 1;
}
// 压栈操作
int push(Stack *s, int value) {
if (isFull(s)) {
printf("栈已满,无法压栈!\n");
return -1;
}
s->data[++(s->top)] = value;
return 0;
}
// 出栈操作
int pop(Stack *s, int *value) {
if (isEmpty(s)) {
printf("栈为空,无法出栈!\n");
return -1;
}
*value = s->data[(s->top)--];
return 0;
}
// 获取栈顶元素
int peek(Stack *s, int *value) {
if (isEmpty(s)) {
printf("栈为空,无法获取栈顶元素!\n");
return -1;
}
*value = s->data[s->top];
return 0;
}
// 主函数进行测试
int main() {
Stack s;
initStack(&s);
push(&s, 10);
push(&s, 20);
push(&s, 30);
int value;
peek(&s, &value);
printf("栈顶元素: %d\n", value);
while (!isEmpty(&s)) {
pop(&s, &value);
printf("出栈元素: %d\n", value);
}
return 0;
}
链式栈的实现
#include "myhead.h"
//定义一个结构体表示链式栈
struct liststack
{
//数据域
int data;
//指针标记栈顶位置
struct liststack *top;
//指针域
struct liststack *next;
};
//初始化链式栈
struct liststack *stack_init()
{
struct liststack *stack=malloc(sizeof(struct liststack));
stack->top=NULL;
stack->next=NULL;
return stack;
}
//入栈
int push(struct liststack *stack,int newdata)
{
struct liststack *newnode=malloc(sizeof(struct liststack));
newnode->data=newdata;
newnode->top=NULL;
newnode->next=NULL;
//尾插新结点
struct liststack *p=stack;
while(p->next!=NULL)
p=p->next;
p->next=newnode;
//更新栈顶指针
stack->top=newnode;
return 0;
}
//出栈
int pop(struct liststack *stack)
{
if(stack->next==NULL)
{
printf("此栈已空!\n");
return -1;
}
//备份栈顶位置的数据
int temp=stack->top->data;
//删除栈顶的结点
struct liststack *p=stack;
while(p->next!=stack->top) //循环结束的时候,p指向的栈顶前面一个结点
p=p->next;
p->next=NULL;
free(stack->top);
//更新栈顶位置
stack->top=p;
return temp;
}
int main()
{
//初始化栈
struct liststack *mystack=stack_init();
//入栈4个数据
push(mystack,18);
push(mystack,28);
push(mystack,38);
push(mystack,48);
//出栈4个数据
for(int i=0; i<5; i++)
printf("出栈数据是:%d\n",pop(mystack));
}