数据结构算法C语言实现(七)--- 3.1 的线性实现及应用举例

  一.简述

  栈,LIFO。是操作受限的线性表,和线性表一样有两种存储表示方法。下面以顺序存储为例,实现。

  二.ADT

  暂无。

  三.头文件

  1 //3_1.h
  2 /**
  3 author:zhaoyu
  4 email:[email protected]
  5 date:2016-6-7
  6 note:realize my textbook <<数据结构(C语言版)>>
  7 */
  8 //Page 46
  9
 10 #ifndef _3_1_H_
 11 #define _3_1_H_
 12 #include <cstdio>
 13 #include <cstdlib>
 14 #include "head.h"
 15 /**
 16 My Code
 17 */
 18 #define SElemType char
 19 //----栈的顺序存储表示----
 20 #define STACK_INIT_SIZE 100//存储空间的初始分配值
 21 #define STACKINCREMENT 10//存储空间分配增量
 22 typedef struct{
 23     SElemType *base;//在栈构造之前和销毁之后,base 值为 NULL
 24     SElemType *top;//栈顶指针
 25     int stacksize;//当前已分配的存储空间,以元素为单位
 26 }SqStack;
 27 //----基本操作的函数原型说明及部分实现----
 28 Status InitStack(SqStack &S)
 29 {
 30     //构造一个空栈 S
 31     S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
 32     if (!S.base)
 33     {
 34         exit(OVERFLOW);
 35     }
 36     S.top = S.base;
 37     S.stacksize = STACK_INIT_SIZE;
 38     return OK;
 39 }//InitStack
 40 Status DestroyStack(SqStack &S)
 41 {
 42     //销毁栈 S,S 不再存在
 43 }
 44 Status ClearStack(SqStack &S)
 45 {
 46     //将 S 置为空栈
 47     S.top = S.base;
 48     return OK;
 49 }
 50 Status StackEmpty(SqStack S)
 51 {
 52     //若 S 为空栈, 则返回 TRUE, 否则返回 FALSE
 53     if (S.base == S.top)
 54     {
 55         return TRUE;
 56     }
 57     else
 58     {
 59         return FALSE;
 60     }
 61 }
 62 int StackLength(SqStack S)
 63 {
 64     //返回 S 的元素的个数,即栈的长度
 65 }
 66 Status GetTop(SqStack S, SElemType &e)
 67 {
 68     //若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;
 69     //否则返回ERROR
 70     if (S.top == S.base)
 71     {
 72         return ERROR;
 73     }
 74     e = *(S.top - 1);
 75     return OK;
 76 }//GetTop
 77 Status Push(SqStack &S, SElemType e)
 78 {
 79     //插入元素 e 为新的栈顶元素
 80     if (S.top - S.base >= S.stacksize)
 81     {//栈满,追加存储空间
 82         S.base = (SElemType *)realloc(S.base,
 83             (S.stacksize+STACKINCREMENT)*sizeof(SElemType));
 84         if (!S.base)
 85         {
 86             exit(OVERFLOW);
 87         }
 88         S.top = S.base + S.stacksize;
 89         S.stacksize += STACKINCREMENT;
 90     }
 91     *S.top++ = e;
 92     return OK;
 93 }//Push
 94 Status Pop(SqStack &S, SElemType &e)
 95 {
 96     //若栈不空,则删除 S 的栈顶元素,用 e 返回其
 97     //值,并返回OK;否则返回ERROR
 98     if (S.top == S.base)
 99     {
100         return ERROR;
101     }
102     e = *--S.top;
103     return OK;
104 }//Pop
105 Status StackTraverse(SqStack S, Status (* visit)())
106 {
107     //从栈底到栈顶一次对栈中每个元素调用函数visit()
108     //一旦visit() 失败,则操作失败
109 }
110
111 //----栈的应用举例-----
112 //注意代码之间的数据类型冲突,所以编译时要根据要编译的部分
113 //注释掉阈值冲突的部分
114 /**
115 algorithm 3.1
116 */
117 /*
118 void conversion()
119 {
120     //对于输入的任意一个非负十进制整数,
121     //打印输出与其等值的 n 进制数
122     //note:书上是8进制,这里稍作拓展
123     SqStack S;
124     InitStack(S);
125     int N, n, e;
126     scanf("%d%d", &N, &n);
127     while (N)
128     {
129         Push(S, N%n);
130         N = N/n;
131     }
132     while (!StackEmpty(S))
133     {//while (!StackEmpty)竟然不报错
134         //StackEmppty是一个非NULL的指针!!!
135         Pop(S, e);
136         printf("%d", e);
137     }
138 }//conversion
139 */
140
141
142 //note:以下两个函数不能与conversion()同时编译
143 //因为具体处理的数据类型不同
144 /**
145 algorithm 3.4
146 */
147
148 void PrintStack_LineEdit(SqStack S)
149 {
150     char ch;
151     SqStack TempStack;
152     InitStack(TempStack);
153     while (!StackEmpty(S))
154     {
155         Pop(S, ch);
156         Push(TempStack, ch);
157     }
158     while (!StackEmpty(TempStack))
159     {
160         Pop(TempStack, ch);
161         putchar(ch);
162     }
163     printf("\n");
164 }
165 void LineEdit()
166 {
167     //利用字符栈 S 从终端接收一行并传送至调用过程的数据区
168     //编译时要将 SElemType 设置成 char(而不是 int)
169     SqStack S;
170     InitStack(S);
171     char c,ch;
172     ch = getchar();
173     while (EOF != ch)//EOF 为全文结束符
174     {
175         while (EOF != ch && ‘\n‘ != ch)
176         {
177             switch (ch)
178             {
179                 case ‘#‘:
180                 {
181                     Pop(S, c);
182                     break;//仅当栈非空时退栈
183                 }
184                 case ‘@‘:
185                 {
186                     ClearStack(S);//重置 S 为空栈
187                     break;
188                 }
189                 default:
190                 {
191                     Push(S, ch);//有效字符进栈
192                     break;
193                 }
194             }
195             ch = getchar();//从终端接收下一个字符
196         }
197         //将从栈底到栈顶的栈内字符传送至调用过程的数据区
198         PrintStack_LineEdit(S);
199         ClearStack(S);//重置 S 为空栈
200         if (EOF != ch)
201         {
202             ch = getchar();
203         }
204     }
205     DestroyStack(S);
206 }//LineEdit
207 #endif

  四.CPP文件

 1 #include "3_1.h"
 2 int main(int argc, char const *argv[])
 3 {
 4 /*    for (int i = 0; i < 5; i++)
 5     {
 6         conversion();
 7     }*/
 8         LineEdit();
 9     return 0;
10 }

  五.测试

  进制转换

  行编辑程序

  

时间: 2024-12-31 05:44:39

数据结构算法C语言实现(七)--- 3.1 的线性实现及应用举例的相关文章

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

数据结构算法C语言实现(一)---2.3线性表的顺序表示和实现

注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习. 二.头文件 1 //head.h 2 /** 3 My Code 4 */ 5 #include

数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

一.简述 [暂无] 二.头文件 1 #ifndef _2_3_part1_H_ 2 #define _2_3_part1_H_ 3 //2_3_part1.h 4 /** 5 author:zhaoyu 6 email:[email protected] 7 date:2016-6-4 8 note:realize my textbook <<数据结构(C语言版)>> 9 */ 10 //----线性表的单链表存储结构---- 11 /** 12 My Code 13 to mak

数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 1 抽象数据类型一元多项式的定义 2 ADT Polyomail{ 3 数据对象:D = {a[i]|a[i]属于TermSet, i = 1,2,3...,m,m>=0 4 TermSet中每个元素包含一个表示系数的实数和表示指数的整数} 5 数据关系 6 基本操作: 7 CreatPolyn(&P, m) 8 操作结果:输入 m 项的系数和指数,建立一元

数据结构算法C语言实现(十)--- 3.3栈与递归的实现

一.简介 汉诺塔问题是递归的一个典型例子,而且书上的讲解很详细,对理解C语言函数及函数传参的工作机制很有帮助,值得一看.而且,递归在我看来和分治.DP.贪心等一样是十分优美的思想,值得学习!!! 二.CPP文件 1 //3_3.cpp 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-8 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 54 9

数据结构算法C语言实现(二十)--- 6.3.1遍历二叉树

一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈及相关操作是第三章实现的,但数据类型做了更改. 二.头文件 1 //3_1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-7 6 note:realize my textbook <<数据结构(C语言版)>&g

数据结构算法C语言实现(十二)--- 3.4循环队列&amp;队列的顺序表示和实现

一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 64 9 #include <cstdio

数据结构算法C语言实现(十一)--- 3.4队列的链式表示和实现

一.简介 FIFO. 二.头文件 1 //3_4_part1.h 2 /** 3 author:zhaoyu 4 email:[email protected] 5 date:2016-6-9 6 note:realize my textbook <<数据结构(C语言版)>> 7 */ 8 //Page 61 9 #include <cstdio> 10 #include "head.h" 11 #define QElemType int 12 //

数据结构算法[c语言]

共16章,共四部分:基础知识,数据结构,排序和搜索. 所有的实现都是使用C语言缩写.任何语言都有优缺点,选用C语言是因为它使用的广泛. 第一章: 导论 第二章: 算法分析原理 第三章: 基本数据结构 第四章: 抽象数据 第五章: 递归和数 第六章: 基本排序方法 第七章: 快速排序 第八章: 归并和归并排序 第九章: 优先队列和堆排序 第十章: 基数排序 第十一章: 特殊目的的排序方法 第十二章: 符号表和二叉搜索树 第十三章: 平衡树 第十四章: 哈希方法 第十五章: 基数搜索 第十六章: 外