数据结构c语言版 栈

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

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

时间: 2024-11-10 13:27:45

数据结构c语言版 栈的相关文章

《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

先附上文档归类目录: 课本源码合辑  链接??? <数据结构>课本源码合辑 习题集全解析  链接??? <数据结构题集>习题解析合辑 博主有话说: 01.自学编程,难免思路阻塞,所以从今天起,我(StrayedKing)决定在本博客陆续更新严蔚敏,吴伟民版<数据结构-C语言版>各章节的课本源码和配套习题集答案解析,目的是为了整理数据结构中的知识点,并与网友交流意见,集思广益,共同进步.        ★注★ 左侧随笔分类下用两个栏目:<课本源码>.<习

数据结构c语言版串的操作

#include<stdio.h> #include<malloc.h> #include<string.h> //定义字符串的结构体 typedef struct { char *str;//字符串 int maxLength;//最大可以存放字符的长度 int length;//目前的字符长度 }DString; //1.初始化操作 //初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值 void Initiate(DString *s,int max,

深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

数据结构(C语言版)顺序栈相关算法的代码实现

这两天完成了栈的顺序存储结构的相关算法,包括初始化.压栈.出栈.取栈顶元素.判断栈是否为空.返回栈长度.栈的遍历.清栈.销毁栈.这次的实现过程有两点收获,总结如下: 一.清楚遍历栈的概念 栈的遍历指的是从栈底想栈顶方向运行visit()函数,这是之前的学习中所忽略的:栈的遍历解除了栈的输出顺序只能从栈顶像栈底方向的限制. 二.清空栈时要不要将stacksize重置 网上看到有的人在实现清空栈这一功能时,将stacksize重置为0,我觉得有点问题,起初的想法是将其重置为初始化时的值,在与同学讨论

深入浅出数据结构C语言版(5)——链表的操作

上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游标数组--我决定还是给它单独写个博文比较好~). 那么,我们的过程应该是怎么样的呢?首先当然是分析需要什么操作,然后再逐一思考该如何实现,最后再以代码的形式写出来. 不难发现,我们希望链表能支持的(基础,可以由此延伸)操作就是: 1.给出第n个元素 2.在第n个元素的后面插入一个元素(包含在最后一个

《数据结构(C语言版)》学习——day1,初识数据结构

1. 什么是数据结构 一般而言,使用计算机解决一个具体的问题时,大致需要经过以下几个步骤: ① 从具体的问题中抽象出一个适当的数学模型: ② 设计一个求解该数学模型的算法: ③ 编写程序,进行测试.调整,直至得到最终的问题解答. 对实际问题建立数学模型的实质是:分析问题,并从中提取操作的对象,并找出这些对象间含有的关系,然后使用数学的语言加以描述. 数据结构(data structure)可以定义为:相互之间存在一种或多种特定关系的数据元素的集合. 在任何问题中,数据元素都不是孤立存在的,而是存

严蔚敏《数据结构(C语言版)》——第1章 绪论

数据是对客观事物的符号表示.在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称. 数据元素是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理. 数据对象是性质相同的数据元素的集合,是数据的一个子集. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合. 存储结构是数据结构在计算机中的表示. 数据类型是一个值的集合和定义在这个值集上的一组操作的总称. 抽象数据类型是指一个数学模型以及定义在该模型上的一组操作,是对一般数据类型的扩展. 试描述数据结构和抽象数据类型

数据结构C语言—顺序栈案例—十进制转二进制

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "SeqStack.h" 4 5 void conversion(int); 6 SeqStack seq; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 conversion(n); 12 return 0; 13 } 14 15 void conversion(int N)

深入浅出数据结构C语言版(12)——从二分查找到二叉树

在很多有关数据结构和算法的书籍或文章中,作者往往是介绍完了什么是树后就直入主题的谈什么是二叉树balabala的.但我今天决定不按这个套路来.我个人觉得,一个东西或者说一种技术存在总该有一定的道理,不是能解决某个问题,就是能改善解决某个问题的效率.如果能够先了解到存在的问题以及已存在的解决办法的不足,那么学习新的知识就更容易接受,也更容易理解. 万幸的是,二叉树的讲解是可以按照上述顺序来进行的.那么,今天在我们讨论二叉树之前,我们先来讨论一种情形.一种操作:假设现在有一个数组,数组中的数据按照某