c语言数据结构顺序栈表

{


typedef int STDataType;
typedef struct Stack{
    STDataType* a;//与
    int top;
    int capacity;
}ST;

//栈实现的接口
void StackInit(ST* ps)  //初始化结构体,传结构体的指针
void DestroyStack(ST* ps)
void StackPush(ST* ps,STDataType x)
void StackPop(ST* ps,);
STDataType StackPop(ST* ps);//取栈顶数据
int StackSize(ST* ps);

}
初始化结构体,传结构体的指针,
头删头插也得传结构体的指针

  1. 取栈顶数据与栈的长度时,为何也要穿结构体的指针呢
  2. 这个结构体指针具体怎么解释呢

基于Monster 组和GPT的调写:

在给定的C语言代码中,ST是一个结构体类型,表示栈的数据结构。它包含以下成员:

  • a:指向存储栈元素的数组的指针。
  • top:表示栈顶的索引。
  • capacity:表示栈的容量。

这里使用了typedef关键字来定义STDataType,它被定义为int类型,用作栈元素的数据类型。

为了操作这个栈数据结构,代码中定义了一些函数接口,包括:

  1. void StackInit(ST* ps):用于初始化栈结构体。它接收一个指向ST结构体的指针作为参数,以便在函数内部修改结构体的成员。
  2. void DestroyStack(ST* ps):用于销毁栈结构体,释放内存。
  3. void StackPush(ST* ps, STDataType x):将元素x压入栈中。它接收一个指向ST结构体的指针作为参数,以便在函数内部修改结构体的成员。
  4. void StackPop(ST* ps):从栈中弹出一个元素。它接收一个指向ST结构体的指针作为参数,以便在函数内部修改结构体的成员。
  5. STDataType StackTop(ST* ps):返回栈顶的元素值,但不弹出。它接收一个指向ST结构体的指针作为参数,以便在函数内部访问结构体的成员。
  6. int StackSize(ST* ps):返回栈的当前元素个数。它接收一个指向ST结构体的指针作为参数,以便在函数内部访问结构体的成员。

为什么在访问栈顶数据和栈长度时需要传递结构体指针呢?这是因为这些操作需要访问或修改结构体的成员,而C语言中函数的参数是通过值传递的。如果不传递指针,那么函数内部将无法修改原始的结构体对象。通过传递指针,函数可以通过指针来访问结构体的成员,以便对其进行操作。

总之,结构体指针在这里的作用是允许函数修改原始的结构体对象,而不是对副本进行操作。这样可以确保栈结构体在函数调用之间保持一致,并且可以正确地访问和修改其成员。

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7501306
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言结构体内含有数组,该结构体作为参数传递时需用指针,否则对数组的修改不会被记录
  • 你还可以看下c语言参考手册中的 c语言-内存模型与数据竞争
  • 除此之外, 这篇博客: C语言的底层逻辑剖析(结构体篇)结构体声明,结构成员的类型,结构体变量的定义和初始化,结构体成员的访问,结构体传参中的 结构体变量的定义和初始化 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这里就是我们的重点了,我们创建了一个类型要先去定义变量然后初始化,最后去使用这个变量对吧,这是我们最终的目的。那么结构体变量如何创建呢?

    这里其实有两种方式,我们来看一段代码:

    struct Stu
    {
    	char name;
    	char sex;
    	int age;
    	float score;
    }s4,s5;//这里两种方式其实是等价的,
    struct Stu s6;//定义的都是全局的结构体变量
    
    int main()
    {
    	struct Stu s1, s2, s3;//此处就是定义的局部的结构体变量了
    	return 0;
    }
    

    那么接下来就是我们的初始化了,怎么进行初始化呢?

    struct Stu
    {
    	char name[20];
    	char sex[10];
    	int age;
    	float score;
    }s4 = { "如花","female",20,60.0 };
    
    int main()
    {
    	struct Stu s = { "zhangsan","male",18,95.5};
    	struct Stu s4 = { "如花","female",20,60.0 };
        printf("%s %s %d %.1f\n", s.name, s.sex, s.age, s.score);
    	return 0;
    }
    

    还有一点值得一提的是,结构体里面是可以放结构体的,例如下面代码示例:

    struct S
    {
    	int a;
    	char b;
    };
    struct Stu
    {
    	char name[20];
    	struct S;//结构体成员可以是结构体
    	int age;
    };
    
    int main()
    {
        //初始化也用大括号嵌套
    	struct Stu p = { "旺财",{28,'c'},18 };
    	printf("%s %d %c %d\n", p.name, p.a, p.b, p.age);
    	return 0;
    }
    

    看到这里,我想你也应该有点感觉了,结构体就是自己定义的一种类型,其实也不是什么高深的东西对不对。

  • 您还可以看一下 王健伟老师的C语言入门篇课程中的 结构体数组、结构体指针小节, 巩固相关知识点