数据结构 栈




栈是限定仅在表尾进行插入或删除操作的线性表。表头端称栈底。表尾端称栈顶。


       
 

(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()只能输入字符型,输入时遇到回车键才从缓冲区依次提取字符.)

posted @ 2016-04-23 11:26  cDoubleJ  阅读(263)  评论(0编辑  收藏  举报