数据结构的总结归纳之——栈

waitwolf 2019-10-25

今天开启数据结构学习的第一章节。

说到数据结构,必须要提的便是结构体了,结构体构建了高级数据结构的框架,在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

关于结构体,分别有如下几个知识点:定义声明结构体,初始化,访问结构体的成员,结构作为函数的参数,指向结构的指针,还有位域(相对不常用)。下面分别对几个知识点进行复习:

1.定义声明结构体。 

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book;

Books为结构体的标签,book为结构变量。

结构体里面,可以包含其他结构体,也可以包含指向自己的结构体。用于构建复杂的数据结构。

2.结构体的初始化。  

struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};

3.访问成员。

可以用“.”进行访问。如上面book结构体,可以用book.book_id进行访问。

4.结构作为函数参数。

可以把结构作为函数参数,传参方式与其他类型的变量或指针类似。

5.指向结构的指针。

struct Books* S_pointer;

使用指针访问结构体成员:必须用到“->”运算符

//实例: 1 #include <stdio.h>
#include <string.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
};
 
/* 函数声明 */
void printBook( struct Books *book );
int main( )
{
   struct Books Book1;        /* 声明 Book1,类型为 Books */
   struct Books Book2;        /* 声明 Book2,类型为 Books */
 
   /* Book1 详述 */
   strcpy( Book1.title, "C Programming");
   strcpy( Book1.author, "Nuha Ali"); 
   strcpy( Book1.subject, "C Programming Tutorial");
   Book1.book_id = 6495407;
 
   /* Book2 详述 */
   strcpy( Book2.title, "Telecom Billing");
   strcpy( Book2.author, "Zara Ali");
   strcpy( Book2.subject, "Telecom Billing Tutorial");
   Book2.book_id = 6495700;
 
   /* 通过传 Book1 的地址来输出 Book1 信息 */
   printBook( &Book1 );
 
   /* 通过传 Book2 的地址来输出 Book2 信息 */
   printBook( &Book2 );
 
   return 0;
}
void printBook( struct Books *book )
{
   printf( "Book title : %s\n", book->title);
   printf( "Book author : %s\n", book->author);
   printf( "Book subject : %s\n", book->subject);
   printf( "Book book_id : %d\n", book->book_id);
}

5.位域(由于不常用,就不写了)

   

经过结构体知识的梳理,下面开始研究栈。

栈(堆栈),百度词条里面的解释是:限定仅在表尾进行插入和删除操作的线性表(是n个具有相同特性的数据元素的有限序列,元素具有一对一关系)。

为了更好的学习,我把堆栈有关的代码全部贴出来:

typedef int ElemType;//自定义类型

typedef struct
{
    ElemType Element[MaxSize];
    int Top;
} SeqStack;

void Init_SeqStack(SeqStack* S_pointer)//创建空栈
{
    S_pointer->Top = -1;
}


bool  Full_SeqStack(SeqStack* S_pointer)//判断栈满
{
    if (S_pointer->Top ==MaxSize -1) return true;
    else return false;
}

bool Empty_SeqStack(SeqStack* S_pointer)//判断栈空
{
    if (S_pointer->Top == -1) return true;
    else return false;
}

bool Push_SeqStack(SeqStack* S_pointer, ElemType x)//进栈
{
    if (Full_SeqStack(S_pointer) == true)
        return Overflow;
    else
    {
        S_pointer->Top++;
        S_pointer->Element[S_pointer->Top] = x;
        return OK;
    }
}

void SetNull_SeqStack(SeqStack* S_pointer)//清空栈
{
    S_pointer->Top = -1;
}

bool Pop_SeqStack(SeqStack* S_pointer, ElemType* x_pointer)//出栈
{
    if (Empty_SeqStack(S_pointer) == true)
        return Underflow;
    else
    {
        *x_pointer = S_pointer->Element[S_pointer->Top];

        S_pointer->Top--;
        return OK;
    }
}

 附上一道经典例题:十进制转换八进制。

void conversion(int Num)
{
    int temp;
    SeqStack ListStack;//定义一个顺序栈
    Init_SeqStack(&ListStack);//创建空栈
    while (Num) {//Num不为0时
        Push_SeqStack(&ListStack, Num % 8);//压入Num%8
        Num = Num / 8;//Num取整
    }
    while (Empty_SeqStack(&ListStack) == false)//栈不为空时
    {
        Pop_SeqStack(&ListStack, &temp);//退栈
        printf("%d", temp);//显示栈顶元素
    }
    SetNull_SeqStack(&ListStack);//清空栈

}

int main()
{
    int Num;
    printf_s("Please input a number:\n");
    scanf_s("%d", &Num);
    conversion(Num);
    return 0;
}

这题本身还有更简单的解法,为了学习栈,我大材小用了。

//解法2:
#include<stdio.h>
#define MaxSize 1001
int main()
{
    int Numb, temp,count=0,i = 0;;
    scanf_s("%d", &Numb);
    int Num[MaxSize];
    while (Numb) { temp = Numb % 8;  Num[i] = temp; i++; Numb = Numb / 8; count++; }
    for (int j = count-1; j >= 0; j--)
        printf_s("%d", Num[j]);
    printf_s("\n");
    return 0;
}

以上,便是今天我学习的内容了。

相关推荐