一.简述

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

  二.ADT

  暂无。

  三.头文件

 //3_1.h
/**
author:zhaoyu
email:zhaoyu1995.com@gmail.com
date:2016-6-7
note:realize my textbook <<数据结构(C语言版)>>
*/
//Page 46 #ifndef _3_1_H_
#define _3_1_H_
#include <cstdio>
#include <cstdlib>
#include "head.h"
/**
My Code
*/
#define SElemType char
//----栈的顺序存储表示----
#define STACK_INIT_SIZE 100//存储空间的初始分配值
#define STACKINCREMENT 10//存储空间分配增量
typedef struct{
SElemType *base;//在栈构造之前和销毁之后,base 值为 NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
//----基本操作的函数原型说明及部分实现----
Status InitStack(SqStack &S)
{
//构造一个空栈 S
S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if (!S.base)
{
exit(OVERFLOW);
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}//InitStack
Status DestroyStack(SqStack &S)
{
//销毁栈 S,S 不再存在
}
Status ClearStack(SqStack &S)
{
//将 S 置为空栈
S.top = S.base;
return OK;
}
Status StackEmpty(SqStack S)
{
//若 S 为空栈, 则返回 TRUE, 否则返回 FALSE
if (S.base == S.top)
{
return TRUE;
}
else
{
return FALSE;
}
}
int StackLength(SqStack S)
{
//返回 S 的元素的个数,即栈的长度
}
Status GetTop(SqStack S, SElemType &e)
{
//若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;
//否则返回ERROR
if (S.top == S.base)
{
return ERROR;
}
e = *(S.top - );
return OK;
}//GetTop
Status Push(SqStack &S, SElemType e)
{
//插入元素 e 为新的栈顶元素
if (S.top - S.base >= S.stacksize)
{//栈满,追加存储空间
S.base = (SElemType *)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if (!S.base)
{
exit(OVERFLOW);
}
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}//Push
Status Pop(SqStack &S, SElemType &e)
{
//若栈不空,则删除 S 的栈顶元素,用 e 返回其
//值,并返回OK;否则返回ERROR
if (S.top == S.base)
{
return ERROR;
}
e = *--S.top;
return OK;
}//Pop
Status StackTraverse(SqStack S, Status (* visit)())
{
//从栈底到栈顶一次对栈中每个元素调用函数visit()
//一旦visit() 失败,则操作失败
} //----栈的应用举例-----
//注意代码之间的数据类型冲突,所以编译时要根据要编译的部分
//注释掉阈值冲突的部分
/**
algorithm 3.1
*/
/*
void conversion()
{
//对于输入的任意一个非负十进制整数,
//打印输出与其等值的 n 进制数
//note:书上是8进制,这里稍作拓展
SqStack S;
InitStack(S);
int N, n, e;
scanf("%d%d", &N, &n);
while (N)
{
Push(S, N%n);
N = N/n;
}
while (!StackEmpty(S))
{//while (!StackEmpty)竟然不报错
//StackEmppty是一个非NULL的指针!!!
Pop(S, e);
printf("%d", e);
}
}//conversion
*/ //note:以下两个函数不能与conversion()同时编译
//因为具体处理的数据类型不同
/**
algorithm 3.4
*/ void PrintStack_LineEdit(SqStack S)
{
char ch;
SqStack TempStack;
InitStack(TempStack);
while (!StackEmpty(S))
{
Pop(S, ch);
Push(TempStack, ch);
}
while (!StackEmpty(TempStack))
{
Pop(TempStack, ch);
putchar(ch);
}
printf("\n");
}
void LineEdit()
{
//利用字符栈 S 从终端接收一行并传送至调用过程的数据区
//编译时要将 SElemType 设置成 char(而不是 int)
SqStack S;
InitStack(S);
char c,ch;
ch = getchar();
while (EOF != ch)//EOF 为全文结束符
{
while (EOF != ch && '\n' != ch)
{
switch (ch)
{
case '#':
{
Pop(S, c);
break;//仅当栈非空时退栈
}
case '@':
{
ClearStack(S);//重置 S 为空栈
break;
}
default:
{
Push(S, ch);//有效字符进栈
break;
}
}
ch = getchar();//从终端接收下一个字符
}
//将从栈底到栈顶的栈内字符传送至调用过程的数据区
PrintStack_LineEdit(S);
ClearStack(S);//重置 S 为空栈
if (EOF != ch)
{
ch = getchar();
}
}
DestroyStack(S);
}//LineEdit
#endif

  四.CPP文件

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

  五.测试

  进制转换

  行编辑程序

  

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

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

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

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

    注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实 ...

  3. 数据结构算法C语言实现(二十七)--- 7.2图的遍历

    一.简述 栈与队列,DFS与BFS.仅以连接表为例实现. 二.头文件 BFS要用到的头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@g ...

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

    一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...

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

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  6. 数据结构算法C语言实现(五)---2.3重新定义线性链表及其基本操作

    一.简述 ...由于链表在空间的合理利用上和插入.删除时不需要移动等的优点,因此在很多场合下,它是线性表的首选存储结构.然而,它也存在着实现某些基本操作,如求线性表的长度时不如顺序存储结构的缺点:另一 ...

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

    一.简述 二叉树的遍历主要是先序.中序.后序及对应的递归和非递归算法,共3x2=6种,其中后序非递归在实现上稍复杂一些.二叉树的遍历是理解和学习递归及体会栈的工作原理的绝佳工具! 此外,非递归所用的栈 ...

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

    一.简述 空队列的处理方法:1.另设一个标志位以区别队列是空还是满:2.少用一个元素空间,约定以队列头指针在队尾指针下一位置上作为队列呈满的状态的标志. 二.头文件 //3_4_part1.h /** ...

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

    一.简介 FIFO. 二.头文件 //3_4_part1.h /** author:zhaoyu email:zhaoyu1995.com@gmail.com date:2016-6-9 note:r ...

随机推荐

  1. jQuery使用.on()无法绑定hover

    发现好像没有hover这个事件,jQuery的hover事件是一个封装,hover算不得一个事件.他只是将mouseover和mouseout合并了用mouseover和mouseout两个配合效果好 ...

  2. md5的C++实现

    一.原理 前一阵子,想知道md5的原理查了一下资料,说得基本都一样,最后让我看懂的是这两个链接: http://blog.csdn.net/qf_study/article/details/26309 ...

  3. React Native开发技术周报1

    (一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...

  4. 实验三 敏捷开发与XP实践

    实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2.完成实验 ...

  5. Datatable删除行的Delete和Remove方法

    在C#中,如果要删除DataTable中的某一行,大约有以下几种办法: 1,使用DataTable.Rows.Remove(DataRow),或者DataTable.Rows.RemoveAt(ind ...

  6. canvas中的碰撞检测笔记

    用 canvas 做小游戏或者特效,碰撞检测是少不了的.本文将会涉及普通的碰撞检测,以及像素级的碰撞检测.(本文的碰撞检测均以矩形为例) 普通碰撞检测 普通的矩形碰撞检测比较简单.即已知两个矩形的各顶 ...

  7. GWT-Dev-Plugin(即google web toolkit developer plugin)for firefox的下载地址

    如果FireFox的版本为20,则对应google-web-toolkit的插件离线下载地址,不要用浏览器直接下载,用Flashget等客户端下载,超快. http://google-web-tool ...

  8. [BZOJ1564][NOI2009]二叉查找树(区间DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1564 分析: 首先因为每个点的数据值不变,所以无论树的形态如何变,树的中序遍历肯定不变 ...

  9. 匈牙利算法(codevs2776)

    type node=^link; link=record des:longint; next:node; end; var n,m,i,t,num:longint; p:node; nd:..] of ...

  10. REST API (from IBM)

    REST 本身是设计风格而不是标准.REST 谈论一件非常重要的事,如何正确地使用 Web标准,例如,HTTP 和 URI.想要了解 REST 最好的方式就是思索与了解 Web 及其工作方式.如果你设 ...