知识点总结报告 1.22
知识点:栈,栈是一种C数据结构,是一种只能在表尾进行增删操作的线性表,特点是后进入的数据先出来,最先进入的数据最后出来,即FILO(First in last out)就像桶装薯片一样。栈是自己定义的结构体,有顺序栈和链表栈。一个顺序栈至少包含一个数组,一个指向已经存入数据的顶部指针和底部指针。队列,队列和栈极其相似,不同处在于队列是只能在表头进行操作的,即FIFL(First in first out)先进先出,就像排队一样。对栈和队列的操作有:初始化、求长度、获取顶部元素、判断为空、清空、销毁、压入数据。
例题:http://acm.hdu.edu.cn/showproblem.php?pid=1702
解法:这道题既可以用数组来解,又可以用栈与队列解。
分析:若通过数组解答,此题定义了不少变量,嵌套了多次,注意变量的作用域,第16行定义的字符数组占用空间很小却能每次都存进INorOUT,还避免了初始化和寻址的麻烦。定义了i,index,j三个作为数组的下标这是因为在处理过程中,需要记录存入的数据,需要用下标来判断,还要实现两种输出所以定义三个能尽量避免混淆。程序第22、30、44、53都是i=index;这是因为在i用于判断输出时应不应该输出None,但注意i必须实时更新。最后不要忘了第61行的n--;
题解(数组):
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int ncircle; 6 scanf("%d",&ncircle); 7 while(ncircle--) 8 { 9 int n,i=0,numArray[10000]={0},index=0,j=0; 10 char FL[5]; 11 scanf("%d %s",&n,FL); 12 while(n) 13 { 14 if(!strcmp(FL,"FILO")) 15 { 16 char INOUT[4]; 17 scanf("%s",INOUT); 18 if(!strcmp(INOUT,"IN")) 19 { 20 scanf("%d",&numArray[index]); 21 index++; 22 i=index; 23 } 24 else 25 { 26 if(i>0) 27 { 28 printf("%d\n",numArray[i-1]); 29 index--; 30 i=index; 31 } 32 else 33 printf("None\n"); 34 } 35 } 36 else 37 { 38 char INOUT[4]; 39 scanf("%s",INOUT); 40 if(!strcmp(INOUT,"IN")) 41 { 42 scanf("%d",&numArray[index]); 43 index++; 44 i=index; 45 } 46 else 47 { 48 if(i>0) 49 { 50 printf("%d\n",numArray[j]); 51 j++; 52 index--; 53 i=index; 54 } 55 else 56 { 57 printf("None\n"); 58 } 59 } 60 } 61 n--; 62 } 63 } 64 return 0; 65 }
题解(栈与队列):
1 #include <stdio.h> 2 #include <string.h> 3 #define MAX 10000 4 typedef struct Stack 5 { 6 int data[MAX]; 7 int *top; 8 int *bottom; 9 }Stack; 10 int main() 11 { 12 int ncircle; 13 scanf("%d",&ncircle); 14 while(ncircle--) 15 { 16 int Top=0,Bottom=0; 17 Stack S={0}; 18 S.top=&S.data[0]; 19 S.bottom=&S.data[0]; 20 char FL[5]; 21 int n; 22 scanf("%d %s",&n,FL); 23 while(n--) 24 { 25 char INOUT[4]; 26 scanf("%s",INOUT); 27 if(!strcmp(FL,"FILO")) 28 { 29 if(!strcmp(INOUT,"IN")) 30 { 31 scanf("%d",&S.data[Top++]); 32 S.top++; 33 } 34 else 35 { 36 if(S.top-S.bottom>0) 37 { 38 printf("%d\n",S.data[--Top]); 39 S.top--; 40 } 41 else 42 { 43 printf("None\n"); 44 } 45 } 46 } 47 else 48 { 49 if(!strcmp(INOUT,"IN")) 50 { 51 scanf("%d",&S.data[Top++]); 52 S.top++; 53 } 54 else 55 { 56 if(S.top-S.bottom>0) 57 { 58 printf("%d\n",S.data[Bottom++]); 59 S.bottom++; 60 } 61 else 62 { 63 printf("None\n"); 64 } 65 } 66 } 67 } 68 } 69 return 0; 70 }
第31、38、51、58行内下标不能用*S.top++等,这是因为那是在引用数组内的元素,不是独立的。