C语言实现栈操作(初始化、入栈、出栈、取栈顶元素、获取栈中元素个数、判空、扩容、销毁)

1.用C语言实现栈常用操作:
(1)、初始化
(2)、入栈
(3)、出栈
(4)、取栈顶元素
(5)、获取栈中元素个数
(6)、判空
(7)、扩容
(8)、销毁
代码如下:

#include"stack.h"
#include<assert.h>
#include<malloc.h>
#include<stdio.h>


//初始化
void StackInit(Stack* ps)
{
	assert(ps);
	ps->array = (DataType*)malloc(sizeof(DataType) * 3);
	if (ps->array == NULL)
	{
		assert(0);
		return;
	}
	ps->capacity = 3;
	ps->size = 0;
}

//扩容
void CheckCapacity(Stack* ps)
{
	assert(ps);
	if (ps->size == ps->capacity)
	{
		ps->array = (DataType*)realloc(ps->array, sizeof(DataType) * ps->capacity * 2);
		if (ps->array == NULL)
		{
			assert(0);
			return;
		}
		ps->capacity *= 2;
	}
}
//入栈
void StackPush(Stack * ps, DataType data)
{
	assert(ps);
	CheckCapacity(ps);
	ps->array[ps->size++] = data;
}

//出栈
void StackPop(Stack* ps)
{
	assert(ps);
	if (StackEmpty(ps))
	{
		return;
	}
	ps->size--;
}

//获取栈顶元素
DataType StackTop(Stack* ps)
{
	assert(ps && !StackEmpty(ps));

	return ps->array[ps->size - 1];
}

//获取栈中元素个数
int StackSize(Stack* ps)
{
	assert(ps);
	return ps->size;
}

//判空
int StackEmpty(Stack* ps)
{
	assert(ps);
	return ps->size == 0;
}

//销毁栈
void StackDestroy(Stack* ps)
{
	assert(ps);
	if (ps->array)
	{
		free(ps->array);
		ps->capacity = 0;
		ps->size = 0;
	}

}

测试代码如下:

//测试
void StackTest()
{
	Stack s;
	StackInit(&s);

	StackPush(&s, 1);
	StackPush(&s, 2);
	StackPush(&s, 3);
	StackPush(&s, 4);
	StackPush(&s, 5);
	StackPush(&s, 6);
	StackPush(&s, 7);

	printf("size=%d",StackSize(&s));
	printf("top=%d", StackTop(&s));

	StackPop(&s);
	StackPop(&s);
	StackPop(&s);

	printf("size=%d", StackSize(&s));
	printf("top=%d", StackTop(&s));

	StackDestroy(&s);
}
int main()
{
	StackTest();
	return 0;
}

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
和顺序的创建、入栈出栈栈顶元素、遍历、销毁操作如下: 顺序: ```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; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值