栈的两种实现方式(C语言)

Posted 乌云中的闪电

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的两种实现方式(C语言)相关的知识,希望对你有一定的参考价值。

栈的两种实现方式

通常情况下,栈的实现方式有两种,一种方法是使用指针,而另一种方法则是使用数组。但是在调用程序时,我们没有必要知道具体使用了哪种方法。

1、链式栈

这里,我们需要用单链表的知识去实现一个栈。具体步骤如下:

1.1创建链表节点

struct Node
{
	int Data;
	struct Node* Next;
};

1.2初始化链表函数

struct Node* CreateNode(int data)
{
	struct Node* NewNode = (struct Node*)malloc(sizeof(struct Node));
	NewNode->Data = data;
	NewNode->Next = NULL;
	return NewNode;
}

1.3创建栈

struct Stack
{
	int StackSize;
	struct Node* pStackTop;
};

1.4初始化栈的函数

struct Stack* CreateStack()
{
	struct Stack* NewStack = (struct Stack*)malloc(sizeof(struct Stack));
	NewStack->StackSize = 0;
	NewStack->pStackTop = NULL;
	return NewStack;
}

1.5Push和POP操作

个人觉得这两个函数可以有很多种写法,下面就介绍我自己写的一种~

void Push_Back_Stack(struct Stack* stack, int data)
{
	struct Node* NewNode = CreateNode(data);
	NewNode->Next = stack->pStackTop;
	stack->pStackTop = NewNode;
	stack->StackSize++;
}

void Pop_Back_Stack(struct Stack* stack)
{
	if (stack->StackSize == 0)
	{
		printf("栈为空,删除失败!\\n");
		return;
	}
	struct Node* pNode = stack->pStackTop->Next;
	free(stack->pStackTop);
	stack->pStackTop = pNode;
	stack->StackSize--;
}

还有一个,就是获取栈顶元素,这个很简单,我就懒得去写了emm…
链式栈大概就是这样,当然,在一些书本上有非常完善的写法,但是,也让我看得头皮发麻…

#ifnef _Stack_h_
struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;

int IsEmpty(Stack S);
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X,Stack S);
ElementType Top(Stack S);
void Pop(Stack S);

#endif /* _Stack_h */

struct Node
{
	ElementType Element;
	PtrToNode Next;
};

2、数组栈

数组栈比链式栈还要容易一些,并且可以避免实用指针(指针当然是能不用就不用了哈哈),但其缺点是它的大小是固定的,我们必须提前声明它的长度,而且无法改变(至少C语言基础篇里面没有这种功能)。
就用一个转化二进制的案例来展现吧:

2.1.1

int stack[10];
int stackTop = -1;
int num = 111 * 2;
printf("%d的二进制值为:", num);
while (num /= 2)
	stack[++stackTop] = num % 2;
while (stackTop-- != -1)
	printf("%d", stack[stackTop + 1]);
printf("\\n");

这段代码看起来是不是很诡异?不过还有一种数组栈的实现方式,可能看上去要好一些。

2.2.1 创建栈####

struct Stack
{
	int* StackMemory;
	int stackTop;
};

2.2.2初始化栈函数

struct Stack* CreateStack()
{
	struct Stack* NewStack = (struct Stack*)malloc(sizeof(struct Stack));
	NewStack->StackMemory = (int*)malloc(sizeof(int) * MAX);
	NewStack->stackTop = -1;
}

2.2.3push和pop操作

void Push_Back(struct Stack* stack, int n)
{
	if (stack->stackTop + 1 == MAX)
	{
		printf("栈已满,无法入栈\\n");
		return;
	}
	stack->StackMemory[++(stack->stackTop)] = n;
	printf("%d\\n", stack->stackTop);
}

int popStack(struct Stack* stack)
{
	if (stack->stackTop == -1)
	{
		printf("栈为空,无法退栈\\n");
		return;
	}
	int data = stack->StackMemory[stack->stackTop];
	stack->StackMemory[stack->stackTop] = 0;
	stack->stackTop--;
	return data;
}

这样虽然繁琐,但个人觉得这样更能体现数组栈。

以上是关于栈的两种实现方式(C语言)的主要内容,如果未能解决你的问题,请参考以下文章

栈的两种实现方式(C语言)

栈的两种实现方式(C语言)

六栈的两种实现方式

Java中栈的两种实现

C语言中存储多个字符串的两种方式

我的C语言学习进阶之旅介绍一下NDK开发中关于JNI函数的两种注册方式:静态注册和动态注册