C語言資料結構(8)--棧 後進先出線性表

solution發表於2021-09-09

背景

棧應該是第一次出現一個很專業名詞的資料結構了吧,但是棧依然是一個非常簡單一維結構。

之所以稱之為棧,就是因為棧的特點是後進先出,就像一個貨棧,先放進去東西總是放在裡面,後放進去的東西放到門口,所以往外拿出來的時候,就先拿出來門口的。

如何表示

我們把線性表看為從上到下的一個一維結構,不管是往線性表裡新增元素還是取出元素,都是在上部(頂部)操作,不就是後進先出了嗎。

所以棧其實就是在一維線性表頂部(最後面)進行新增或者取出的集合。

棧的操作

  • 遍歷,從棧頂到棧尾展示所有元素
  • 入棧,將一個元素放入棧中
  • 出棧,將棧頂元素拿出來

其他操作實際上都是以這兩個操作為基礎的,所以不再重複演示。

棧的程式碼實現

/*
* C語言棧實現
* 作者:熊貓大大
* 時間:2019-09-28
*/
#include<stdio.h>
#define STACK_LENGTH 10

//定義結構體儲存棧資訊
struct Stack
{
	//棧元素
	int element[STACK_LENGTH];
	//棧頂位置 top==0表示元素為空 top==x表示有x個元素且元素位置在element[x-1]處
	int top;
};

//展示棧內所有元素,從棧頂到棧底的順序展示即可
void printStack(struct Stack *p)
{
	int i;
	printf("==================棧元素如下n");
	for (i = p->top-1; i>=0; i--)
	{
		printf("%d ", p->element[i]);
	}
}

//入棧
int stackIn(struct Stack *p, int num)
{
	if (p->top>STACK_LENGTH - 1)//棧滿了
		return 0;//入棧失敗
	p->element[p->top] = num;
	p->top++;
	return 1;//入棧成功
}

//出棧,以返回值的形式提供出棧元素的值
int stackOut(struct Stack *p,int *result)
{
	if (p->top <= 0)//空棧
		return 0;
	//取棧頂元素
	*result = p->element[p->top - 1];
	//棧頂元素出棧
	p->top--;
	return 1;
}

//入口
int main()
{
	//初始化
	struct Stack stack;
	stack.top = 0;
	printStack(&stack);

	//入棧
	stackIn(&stack, 1);
	stackIn(&stack, 2);
	stackIn(&stack, 3);
	stackIn(&stack, 7);
	stackIn(&stack, 8);
	stackIn(&stack, 9);
	//輸出
	printStack(&stack);

	//出棧
	int result;
	stackOut(&stack, &result);
	printf("OUT:%dn",result);
	stackOut(&stack, &result);
	printf("OUT:%dn", result);
	stackOut(&stack, &result);
	printf("OUT:%dn", result);
	printStack(&stack);
	stackOut(&stack, &result);
	printf("OUT:%dn", result);
	stackOut(&stack, &result);
	printf("OUT:%dn", result);
	stackOut(&stack, &result);
	printf("OUT:%dn", result);
	printStack(&stack);
	return 1;
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2459/viewspace-2823808/,如需轉載,請註明出處,否則將追究法律責任。

相關文章