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

Posted iywen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构的总结归纳之——栈相关的知识,希望对你有一定的参考价值。

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

  说到数据结构,必须要提的便是结构体了,结构体构建了高级数据结构的框架,在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> 2 #include <string.h> 3 4 struct Books 5 { 6 char title[50]; 7 char author[50]; 8 char subject[100]; 9 int book_id; 10 }; 11 12 /* 函数声明 */ 13 void printBook( struct Books *book ); 14 int main( ) 15 { 16 struct Books Book1; /* 声明 Book1,类型为 Books */ 17 struct Books Book2; /* 声明 Book2,类型为 Books */ 18 19 /* Book1 详述 */ 20 strcpy( Book1.title, "C Programming"); 21 strcpy( Book1.author, "Nuha Ali"); 22 strcpy( Book1.subject, "C Programming Tutorial"); 23 Book1.book_id = 6495407; 24 25 /* Book2 详述 */ 26 strcpy( Book2.title, "Telecom Billing"); 27 strcpy( Book2.author, "Zara Ali"); 28 strcpy( Book2.subject, "Telecom Billing Tutorial"); 29 Book2.book_id = 6495700; 30 31 /* 通过传 Book1 的地址来输出 Book1 信息 */ 32 printBook( &Book1 ); 33 34 /* 通过传 Book2 的地址来输出 Book2 信息 */ 35 printBook( &Book2 ); 36 37 return 0; 38 } 39 void printBook( struct Books *book ) 40 { 41 printf( "Book title : %s ", book->title); 42 printf( "Book author : %s ", book->author); 43 printf( "Book subject : %s ", book->subject); 44 printf( "Book book_id : %d ", book->book_id); 45 }

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

   

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

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

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

 1 typedef int ElemType;//自定义类型
 2 
 3 typedef struct
 4 {
 5     ElemType Element[MaxSize];
 6     int Top;
 7 } SeqStack;
 8 
 9 void Init_SeqStack(SeqStack* S_pointer)//创建空栈
10 {
11     S_pointer->Top = -1;
12 }
13 
14 
15 bool  Full_SeqStack(SeqStack* S_pointer)//判断栈满
16 {
17     if (S_pointer->Top ==MaxSize -1) return true;
18     else return false;
19 }
20 
21 bool Empty_SeqStack(SeqStack* S_pointer)//判断栈空
22 {
23     if (S_pointer->Top == -1) return true;
24     else return false;
25 }
26 
27 bool Push_SeqStack(SeqStack* S_pointer, ElemType x)//进栈
28 {
29     if (Full_SeqStack(S_pointer) == true)
30         return Overflow;
31     else
32     {
33         S_pointer->Top++;
34         S_pointer->Element[S_pointer->Top] = x;
35         return OK;
36     }
37 }
38 
39 void SetNull_SeqStack(SeqStack* S_pointer)//清空栈
40 {
41     S_pointer->Top = -1;
42 }
43 
44 bool Pop_SeqStack(SeqStack* S_pointer, ElemType* x_pointer)//出栈
45 {
46     if (Empty_SeqStack(S_pointer) == true)
47         return Underflow;
48     else
49     {
50         *x_pointer = S_pointer->Element[S_pointer->Top];
51 
52         S_pointer->Top--;
53         return OK;
54     }
55 }

 

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

 1 void conversion(int Num)
 2 {
 3     int temp;
 4     SeqStack ListStack;//定义一个顺序栈
 5     Init_SeqStack(&ListStack);//创建空栈
 6     while (Num) {//Num不为0时
 7         Push_SeqStack(&ListStack, Num % 8);//压入Num%8
 8         Num = Num / 8;//Num取整
 9     }
10     while (Empty_SeqStack(&ListStack) == false)//栈不为空时
11     {
12         Pop_SeqStack(&ListStack, &temp);//退栈
13         printf("%d", temp);//显示栈顶元素
14     }
15     SetNull_SeqStack(&ListStack);//清空栈
16 
17 }
18 
19 int main()
20 {
21     int Num;
22     printf_s("Please input a number:
");
23     scanf_s("%d", &Num);
24     conversion(Num);
25     return 0;
26 }

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

 1 //解法2:
 2 #include<stdio.h>
 3 #define MaxSize 1001
 4 int main()
 5 {
 6     int Numb, temp,count=0,i = 0;;
 7     scanf_s("%d", &Numb);
 8     int Num[MaxSize];
 9     while (Numb) { temp = Numb % 8;  Num[i] = temp; i++; Numb = Numb / 8; count++; }
10     for (int j = count-1; j >= 0; j--)
11         printf_s("%d", Num[j]);
12     printf_s("
");
13     return 0;
14 }

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

以上是关于数据结构的总结归纳之——栈的主要内容,如果未能解决你的问题,请参考以下文章

DevOps之归纳总结

数据结构学习笔记(栈队列)整理与总结

数据结构学习笔记(栈队列)整理与总结

总结与归纳之字符串

201621123062《java程序设计》第九周作业总结

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段