对于栈学习的总结
目录
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;
}
程序运行结果
总结
也没有什么好总结的啦谢谢大家的支持。啦啦啦