对于栈学习的总结

目录

1.新建栈类型

2.栈的初始化

3.栈的创建

4.出栈

5.入栈

6.栈的输出

7.测试

8.总结

栈简介

栈是一种仅限于在表尾进行插入和删除操作的线性表,和之前介绍过的线性表一样,它也有线性和链式两种结构,在这里我向大家介绍线性栈的建立与使用,鄙人只是理工大的一名大二的学生,不对的地方请大家多多指教。好了让我打开vs 创建一个新项目然后“ctrl +shift +a ”创建一个一个main 文件开始我们的编程之旅吧。

1.新建栈类型

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Stack {
	int T, B,L,P;
	int *top=&T;
	int *base=&B;
	int *Length=&L;
	int *position_top = &P;
}*St,stack;

首先我们新建一个Stack结构体,里面包含4个int指针top,base,Length,还有position-top,其中Length,和position_top在作者我在之前考虑到指针引用的问题把他们设置成了指针,后来想起来完全没有这个必要,如果各位嫌麻烦的话不妨把他们设置成普通的常量。这里的typedef定义了Stack的指针类型,和Stack的别名stack;top为栈顶元素的指针,base则为栈底元素的指针,考虑到他们都是指针的原因,所以定义了一些随机变量,主要是解决野指针的问题,另外定义position_top的目的是为了更好地记录top的位置,也是为了更好地确定栈中元素的个数。

2.栈的初始化

void InitStack(St st,int Len)
{
	*(st->Length) = Len;
	st->base = (int*)malloc(*(st->Length) * sizeof(int));
	st->top = st->base;
	*(st->position_top) = 0;
}

InitStack函数有两个参数,一个是栈的指针另外一个则是要创建栈的大小。首先让栈的长度Length指向Len,再用malloc的方法一次性申请所需要的空间,这里我们的栈主要是放整型数据,故使用int.开始的时候栈中没有元素故让base=top;position_top指向0.

3.栈的创建

void CreatStack(St st)
{	
	char response='Y';
	printf("Now you can input the data!\n");
	while (response == 'Y' || response == 'y')
	{
		if (*(st->position_top) >= (*(st->Length) - 1))
		{
			printf("sorry you stack if full.");
			getchar();
			getchar();
			exit(0);
		}
		printf("data%d= ", *(st->position_top));
		scanf_s("%d", st->top);
		getchar();
		st->top++;
		*(st->position_top)=*(st->position_top)+1;
		printf("%d \n", *(st->position_top));
		printf("Do you want to input the data again ?");
		response = getchar();
	}
}

接下啦我们写CreatStack函数

使用response+while 的方式控制与使用者的交互界面,在while后面加一个判断,主要判断满栈的情况,增加程序的健壮性。添加新元素的原理很简单,想让top指向入栈的数值,然后top++;让top等于下一个节点;每次添加进新元素后position_top指向的值都加一,注意scanf_s后面有个getchar();这主要是为了“吃掉”输入数值后敲的那个inter键。

4.出栈

void PopStack(St st,int *e)
{
	*e =*st->top;
	st->top--;
	*(st->position_top)=*(st->position_top)-1;
}

PopStack函数有两个参数,一个是操作栈的指针,另外一个指针指向出栈的值。

让top等于它上一个指针,然后让position_top指向的值减一。

5.入栈

void PushStack(St st,int Da)
{
	if (*(st->position_top) > (*(st->Length) - 1))
	{
		printf("Can not pust the data!!!\n");
		printf("becaude you stack is full");
		getchar();
		getchar();
		exit(0);
	}
	*(st->top) = Da;
	st->top++;
	*(st->position_top) = *(st->position_top) + 1;
}

入栈函数就是让top指向入栈元素Da,然后top++,position_top指向的值加一,注意*(position_top)++的语句是不对的要按上面代码才行。

6.栈的输出

void DisplayStack(St st)
{
	int *position = st->base;
	while (position != st->top)
	{
		printf("%d ", *position);
		position++;  
	}
	getchar();
}

使用循环,从base到top,依次输出指向的值。

7.测试

void Stacktest()
{
	stack S;
	St st = &S;
	int E, *e = &E;
	InitStack(st, 100);
	CreatStack(st);
	PopStack(st, e);
	PushStack(st, 89);
	DisplayStack(st);
	getchar();
}

在主函数中调用测试函数

int main()
{
	Stacktest();
	return 0;
}

程序运行结果

对于栈学习的总结

总结

也没有什么好总结的啦谢谢大家的支持。啦啦啦