数据结构 栈
栈
栈是限定仅在表尾进行插入或删除操作的线性表。表头端称栈底。表尾端称栈顶。
![](https://images2015.cnblogs.com/blog/830410/201604/830410-20160423111849788-1052437844.png)
![](https://images2015.cnblogs.com/blog/830410/201604/830410-20160423112306241-1412959765.png)
(1)先进后出
(2)top = base 表示栈空
(3)非空栈中的栈顶指针始终在栈顶元素的下一个位置上,如上图
(4)若base = null 表明栈结构不存在
栈的实现代码
1 #include<stdio.h> 2 #include<stdlib.h> 3 #define STACK_INIT_SIZE 100 4 #define STACKINCREMENT 10 5 typedef int Status; 6 #define OK 1 7 #define ERROR 0 8 typedef struct 9 { 10 char *base; /*在栈构造之前和销毁之后,base值为NULL*/ 11 char *top; /*栈顶指针*/ 12 int stacksize; /*当前已分配的存储空间,以元素为单位*/ 13 }sqstack; 14 15 //创建一个栈 16 void CreateStack(sqstack *s) 17 {/*构造一个空栈S*/ 18 (*s).base = (char*)malloc(STACK_INIT_SIZE*sizeof(char)); 19 if (!(*s).base) exit(ERROR); /*存储分配失败*/ 20 (*s).top = (*s).base; 21 (*s).stacksize = STACK_INIT_SIZE; 22 } 23 24 25 //入栈 26 void push(sqstack *s, char x) /*插入元素e为新的元素*/ 27 { 28 if (((*s).top - (*s).base) >= (*s).stacksize) 29 { 30 (*s).base = (char *)realloc((*s).base, ((*s).stacksize + STACKINCREMENT)*sizeof(char)); 31 if (!(*s).base) exit(ERROR); /*存储分配失败*/ 32 (*s).top = (*s).base + (*s).stacksize; 33 (*s).stacksize += STACKINCREMENT; 34 } 35 *((*s).top)++ = x; 36 } 37 38 39 //出栈 40 int pop(sqstack *s) 41 {/*若栈不空,则删除S的栈顶元素,用e返回其值,并返回值*/ 42 if ((*s).top == (*s).base) return ERROR; 43 else { 44 (*s).top = (*s).top - 1; 45 46 char str; 47 str = *((*s).top); 48 printf("%c ", str); 49 } 50 return OK; 51 } 52 53 int main() 54 { 55 sqstack s; 56 57 CreateStack(&s); 58 59 int num, i; 60 char a, c;//c用来吃回车键 61 printf("输入入栈元素个数:\n"); 62 scanf("%d", &num); 63 c = getchar();//scanf的输入规则可以看下方备注 64 printf("输入入栈元素:\n"); 65 for (i = 0; i < num; i++){ 66 scanf("%c", &a); 67 c = getchar(); 68 push(&s, a); 69 } 70 printf("出栈顺序为:\n"); 71 for (i = 0; i < num; i++){ 72 pop(&s); 73 } 74 system("pause"); 75 return 0; 76 }
scanf的输入规则:
scanf函数最常用的两种输入方式%d整数输入方式,以及%c字符输入方式。
用%d方式输入整数时,输入一串数字然后按回车符,输入就完成了。而用%c方式输入字符时,就稍微复杂一点。一般来说用%c输入字符时,当输完以后,都习惯按一下回车,这时回车符就成了一个问题。
【例1】:
scanf("%c",&a); /*此时输入一个字符,并按下回车,那么变量a将会正确接收输入的字符*/
scanf("%c",&b); /*但是变量b将会接收到回车符,其值为10,或者说ASCII码为10*/
【例2】:
scanf("%d",&x); /*此时输入一串数字并回车,变量x将正常接收到输入的整数*/
scanf("%d",&y); /*变量y不会接收到回车符,需要用户继续输入数字,并回车,正常接收到整数*/
【例3】:
scanf("%d",&x); /*此时输入一串数字并回车,变量x将正常接收到输入的整数*/
scanf("%c",&a); /*但是变量a将会接收到回车符,其值为10,或者说ASCII码为10*/
【例4】:
scanf("%d",&x); /*此时输入一串数字并回车,变量x将正常接收到输入的整数*/
scanf("%d",&y); /*若此时输入的是字母而不是数字,比如输入“s”并回车*/
/*那么变量y将不会接收到任何字符或数字,其值保持原样,不发生任何改变*/
scanf("%c",&a); /*此时变量a将接收到上一步输入的字母*/
/*即变量a中存储的字符将是"s",而不是回车符*/
总结:可以用char a = getchar(); 或者 char a; scanf(“%c”,&a);消除回车键 (getchar()只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符.)