栈的基本操作(C语言实现)创建,销毁,入栈,出栈


前言

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

一、栈(Stack)的基本量建立

typedef int STDataType;//栈的数据类型

typedef struct stack {
	STDataType* a;//栈存放的位置
	int top;//用来标记栈顶
	int capacity;//栈的容量
}ST;//把基本量封装成一个结构体

二、栈的基本操作

在这里插入图片描述

2.1栈的初始化(STInit)

void STInit(ST* ps) {
	assert(ps);//栈可以为空,但是存放栈相关基本量的结构体不能为空
	ps->a = (STDataType*)malloc(sizeof(STDataType) * 4);
	//初始栈的大小为4
	if (NULL == ps->a) {
		perror("Init error");
		return;
	}//判断是否为有效空间
	ps->top = 0;//top从0开始,
	//top在目前栈顶元素的下一个位置,没存放数据
	ps->capacity = 4;//初始容量
}

2.2入栈(STPush)

在这里插入图片描述

void STPush(ST* ps,STDataType x) {
	assert(ps);
	if (ps->capacity == ps->top) {
		STDataType* tmp = (STDataType*)realloc(ps->a,sizeof(STDataType) * ps->capacity * 2);
		//判断当前容量是否支持入栈,不够则进行扩容
		if (tmp == NULL) {
			perror("STPush error");
			return;
		}
		ps->a = tmp;//a指向新开辟的空间
		ps->capacity *= 2;//新空间容量为原来二倍
	}
	ps->a[ps->top] = x;//在当前top指向插入x
	ps->top++;//top后移一个位置
}

2.25判断是否为空(STEmpty)

bool STEmpty(ST* ps) {
	assert(ps);
	return ps->top == 0;
	//因为top指向最后一个数据的后一个位置,所以top
	//为0,说明前面没有元素
}

2.3获取栈顶元素(STTop)

STDataType STTop(ST* ps) {
	assert(ps);
	assert(!STEmpty(ps));
	//判断是否为空,为空则不能读取栈顶元素
	return ps->a[ps->top - 1];
	//因为top指向最后一个数据的后一个位置,
	//top下标的位置为空,所以要向前一位
}

2.4出栈(STPop)

void STPop(ST* ps) {
	assert(ps);
	assert(!STEmpty(ps));
	//判断是否为空,为空则不能出栈
	ps->top--;
	//这里出栈并不是真正意义上的销毁数据,
	//而是让top前移一个位置
	//而我们不会访问top下标及其以后的位置,所以
	//达到了类似消除的效果
	//当top为0就代表出栈了全部数据
}

2.5栈的大小(STSize)

int STSize(ST* ps) {
	assert(ps);
	return ps->top ;
	//数组是从0开始的,而top的位置在最后一个数据
	//后一个位置,所以top就是栈中数据数量
}

2.6栈的销毁(STDestroy)

void STDestroy(ST* ps){
	assert(ps);
	free(ps->a);
	//释放空间
	ps->a = NULL;
	//别忘了置空
	ps->top = 0;
	ps->capacity = 0;
}

总结

栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
链栈和顺序创建入栈出栈、取顶元素、遍历、销毁等操作如下: 顺序: ```c #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 定义的最大容量 typedef struct { int data[MAX_SIZE]; // 存放中元素的数组 int top; // 顶指针 } SeqStack; // 初始化 void InitStack(SeqStack *s) { s->top = -1; } // 判断是否为空 int IsEmptyStack(SeqStack s) { return s.top == -1; } // 判断是否已满 int IsFullStack(SeqStack s) { return s.top == MAX_SIZE - 1; } // 入栈 int Push(SeqStack *s, int x) { if (IsFullStack(*s)) { printf("Stack overflow!\n"); return 0; } else { s->top++; s->data[s->top] = x; return 1; } } // 出栈 int Pop(SeqStack *s) { if (IsEmptyStack(*s)) { printf("Stack underflow!\n"); return 0; } else { s->top--; return 1; } } // 取顶元素 int GetTop(SeqStack s) { if (IsEmptyStack(s)) { printf("Stack is empty!\n"); return -1; } else { return s.data[s.top]; } } // 遍历 void TraverseStack(SeqStack s) { int i; for (i = s.top; i >= 0; i--) { printf("%d ", s.data[i]); } printf("\n"); } // 销毁 void DestroyStack(SeqStack *s) { s->top = -1; } int main() { SeqStack s; InitStack(&s); int n, x, i; printf("Enter the number of elements you want to push into the stack: "); scanf("%d", &n); printf("Enter %d elements: ", n); for (i = 0; i < n; i++) { scanf("%d", &x); Push(&s, x); } printf("Stack elements: "); TraverseStack(s); printf("Top element: %d\n", GetTop(s)); printf("Pop the top element...\n"); Pop(&s); printf("Stack elements after pop: "); TraverseStack(s); DestroyStack(&s); printf("Stack is destroyed!\n"); return 0; } ``` 链栈: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node *next; } LinkNode; typedef struct { LinkNode *top; // 顶指针 } LinkStack; // 初始化 void InitStack(LinkStack *s) { s->top = NULL; } // 判断是否为空 int IsEmptyStack(LinkStack s) { return s.top == NULL; } // 入栈 int Push(LinkStack *s, int x) { LinkNode *p = (LinkNode *) malloc(sizeof(LinkNode)); if (p == NULL) { printf("Malloc failed!\n"); return 0; } else { p->data = x; p->next = s->top; s->top = p; return 1; } } // 出栈 int Pop(LinkStack *s) { if (IsEmptyStack(*s)) { printf("Stack underflow!\n"); return 0; } else { LinkNode *p = s->top; s->top = p->next; free(p); return 1; } } // 取顶元素 int GetTop(LinkStack s) { if (IsEmptyStack(s)) { printf("Stack is empty!\n"); return -1; } else { return s.top->data; } } // 遍历 void TraverseStack(LinkStack s) { LinkNode *p = s.top; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } // 销毁 void DestroyStack(LinkStack *s) { LinkNode *p = s->top; LinkNode *q; while (p != NULL) { q = p->next; free(p); p = q; } s->top = NULL; } int main() { LinkStack s; InitStack(&s); int n, x, i; printf("Enter the number of elements you want to push into the stack: "); scanf("%d", &n); printf("Enter %d elements: ", n); for (i = 0; i < n; i++) { scanf("%d", &x); Push(&s, x); } printf("Stack elements: "); TraverseStack(s); printf("Top element: %d\n", GetTop(s)); printf("Pop the top element...\n"); Pop(&s); printf("Stack elements after pop: "); TraverseStack(s); DestroyStack(&s); printf("Stack is destroyed!\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值