栈的实现(C语言)

目录

1. C语言栈的实现

  1.1 栈的结点结构体设计:

  1.2 栈的初始化:

  1.3栈的插入:插入前判断是否需要扩容

1.4 栈的删除:将栈的top--

1.5 返回栈顶元素;返回top-1的位置

1.6 返回栈内有效元素个数

1.7 判断栈是否为空:为空返回true,不为空返回false

1.8 删除栈:释放申请的空间


1. C语言栈的实现

栈后入先出的特性,跟数组尾部的插入删除是O(1)很适合,所以用一个动态增长的数组来实现栈

栈的主要功能

  1.1 栈的结点结构体设计:

                创建结构体类型StackNode

#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int StackDataType;

typedef struct StackNode
{
	StackDataType* _stack;//栈
	int _capacity;//栈的容量
	int _top;//栈顶元素位置
}Stack;

  1.2 栈的初始化:

void StackInit(Stack* st)
{
	st->_stack = NULL;
	st->_capacity = 0;
	st->_top = 0;
}
//首先先把栈内的数组置为空 top\capacity都置为0 

top这里设计的是指向栈顶元素的下一个元素,top也就是栈内有效元素的个数。而数组因为下表,最后一个元素的在数组中的位置需要-1

  1.3栈的插入:插入前判断是否需要扩容

void StackPush(Stack* st, StackDataType data)
{
	assert(st);
	if (st->_capacity == st->_top)//判断是否需要扩容
	{
		int newCapacity = st->_capacity == 0 ? 4 : 2 * st->_capacity;//新容量判定
		st->_stack = (StackDataType*)realloc(st->_stack, newCapacity * sizeof(StackDataType));//扩容
		st->_capacity = newCapacity;
	}
	st->_stack[st->_top] = data;
	st->_top++;
}

1.4 栈的删除:将栈的top--

void StackPop(Stack* st)
{
	assert(st);
	assert(st->_top);
	st->_top--;
}

1.5 返回栈顶元素;返回top-1的位置

StackDataType StcakTop(Stack* st)
{
	assert(st);
	return st->_stack[st->_top - 1];
}

1.6 返回栈内有效元素个数

int StackSize(Stack* st)
{
	assert(st);
	return st->_top;
}

1.7 判断栈是否为空:为空返回true,不为空返回false

bool StackEmpty(Stack* st)
{
	assert(st);
	if (st->_top == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
}

1.8 删除栈:释放申请的空间

void StackDestory(Stack* st)
{
	assert(st);
	if (st->_stack != NULL)
	{
		free(st->_stack);
	}
	st->_capacity = st->_top = 0;

}

快速排序的非递归版可以使用数组模拟的操作,也可以使用指针实现。以下是使用指针实现C语言代码: ```c #include <stdio.h> void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } void quickSort(int arr[], int left, int right) { int stack[right - left + 1]; int top = -1; stack[++top] = left; stack[++top] = right; while (top >= 0) { right = stack[top--]; left = stack[top--]; int pivot = arr[right]; int i = left - 1; for (int j = left; j <= right - 1; j++) { if (arr[j] < pivot) { i++; swap(&arr[i], &arr[j]); } } swap(&arr[i + 1], &arr[right]); int pivotIndex = i + 1; if (pivotIndex - 1 > left) { stack[++top] = left; stack[++top] = pivotIndex - 1; } if (pivotIndex + 1 < right) { stack[++top] = pivotIndex + 1; stack[++top] = right; } } } void printArray(int arr[], int size) { for (int i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {5, 9, 1, 3, 10, 4, 8, 6, 2, 7}; int size = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, size - 1); printf("Sorted array: "); printArray(arr, size); return 0; } ``` 这个实现中,我们使用一个指针数组 `stack` 来模拟的操作,`top` 指针表示当前顶元素的位置。我们首先将左右边界压入中,然后在 while 循环中进行以下操作: - 弹出顶的右边界和左边界 - 选择最后一个元素作为 pivot,进行快速排序的划分操作 - 将 pivot 移动到正确的位置上 - 根据 pivot 的位置将左右两个子数组的边界压入中 这样我们可以使用 O(1) 的空间复杂度来实现快速排序的非递归版。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值