顺序栈的实现[1]1

合集下载

DS-chapter-03

DS-chapter-03

18
3.2 栈的应用举例
3.2.1 数制转换 3.2.2 括号匹配的检验 3.2.3 行编辑程序 3.2.4 迷宫求解 3.2.5 表达式求值
19
3.2.1 数制转换 十进制N和其它进制数d的转换是计算机实现计算的 基本问题,其解决方法很多,其中一个简单算法基 于下列原理: N=(N div d)*d+N mod d ( 其中:div为整除运算,mod为求余运算) 例如 (1348)10=(2504)8,其运算过程如下:
3、入栈
int push(DataType e ){ p=new Node(e,null); p->next=top->next; top->next=p; return 1; } //end push
17
二、链栈
4、出栈
DataType pop( ){ if (!top->next) return null; p=top->nex; top->next=p->next; e=p->data; free(p); return e; } //end push
10
在一个数组中定义两个栈
0
M-1
Hale Waihona Puke 栈1底栈1顶栈2顶
栈2底
11
基本操作的算法描述
1、构造函数
Stack(int s){ elem=new DataType[s]; maxSize=ms; top=-1; }
// 申请数组 // 置空栈
12
2、读栈顶元素
DataType getTop( ){ if (top<0) return null; return elem[top]; } //end getTop

顺序栈的基本运算

顺序栈的基本运算

顺序栈的基本运算顺序栈是一种经典的数据结构,它是基于数组实现的一种数据结构,具有先进后出(LIFO)的特点。

顺序栈在计算机科学和软件开发中有广泛的应用,是我们学习数据结构和算法的重要基础。

顺序栈的基本运算主要包括入栈、出栈、判空和获取栈顶元素。

下面我们将逐一介绍这些运算。

1. 入栈:入栈即向顺序栈中添加一个元素。

入栈操作需要把元素放入数组中的下一个空闲位置,并更新栈顶指针。

当数组已满时,无法进行入栈操作,这种情况称为栈溢出。

2. 出栈:出栈即从顺序栈中移除栈顶元素。

出栈操作实际上是将栈顶指针减一,并返回栈顶元素的值。

当栈为空时,无法进行出栈操作,这种情况称为栈下溢。

3. 判空:判空操作是判断顺序栈中是否没有任何元素。

可以通过检查栈顶指针是否为-1来判断栈是否为空。

4. 获取栈顶元素:获取栈顶元素是通过返回栈顶指针指向的元素来实现的。

获取栈顶元素不会改变栈的状态。

以上就是顺序栈的基本运算,通过这些运算,我们可以方便地进行栈的操作。

顺序栈的使用可以帮助我们解决许多实际问题。

顺序栈在实际中有许多应用。

例如,我们可以使用顺序栈来实现浏览器的前进和后退功能。

每次访问一个新的网页时,我们可以将当前网页的信息入栈;当点击后退按钮时,我们可以出栈以获取上一个访问过的网页信息。

另一个例子是编辑器中的撤销操作,我们可以使用顺序栈来存储每次操作的历史记录,当需要进行撤销操作时,可以通过出栈操作来获取前一个状态。

在编程中使用顺序栈时,我们要注意栈溢出和栈下溢的情况。

为了避免栈溢出,我们应该在进行入栈操作之前判断栈是否已满;为了避免栈下溢,我们应该在进行出栈操作之前判断栈是否为空。

总结而言,顺序栈是一种简单而有效的数据结构,可以帮助我们解决许多实际问题。

通过掌握顺序栈的基本运算,我们可以更好地理解数据结构和算法的原理,为软件开发和问题解决提供有力支持。

数据结构--栈和队列基础知识

数据结构--栈和队列基础知识

数据结构--栈和队列基础知识⼀概述栈和队列,严格意义上来说,也属于线性表,因为它们也都⽤于存储逻辑关系为 "⼀对⼀" 的数据,但由于它们⽐较特殊,因此将其单独作为⼀篇⽂章,做重点讲解。

既然栈和队列都属于线性表,根据线性表分为顺序表和链表的特点,栈也可分为顺序栈和链表,队列也分为顺序队列和链队列,这些内容都会在本章做详细讲解。

使⽤栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈;使⽤队列存储数据,讲究 "先进先出",即最先进队列的数据,也最先出队列。

⼆栈2.1 栈的基本概念同顺序表和链表⼀样,栈也是⽤来存储逻辑关系为 "⼀对⼀" 数据的线性存储结构,如下图所⽰。

从上图我们看到,栈存储结构与之前所了解的线性存储结构有所差异,这缘于栈对数据 "存" 和 "取" 的过程有特殊的要求:1. 栈只能从表的⼀端存取数据,另⼀端是封闭的;2. 在栈中,⽆论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。

拿图 1 的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。

因此,当需要从栈中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。

因此,我们可以给栈下⼀个定义,即栈是⼀种只能从表的⼀端存取数据且遵循 "先进后出" 原则的线性存储结构。

通常,栈的开⼝端被称为栈顶;相应地,封⼝端被称为栈底。

因此,栈顶元素指的就是距离栈顶最近的元素,拿下图中的栈顶元素为元素 4;同理,栈底元素指的是位于栈最底部的元素,下中的栈底元素为元素 1。

2.2 进栈和出栈基于栈结构的特点,在实际应⽤中,通常只会对栈执⾏以下两种操作:向栈中添加元素,此过程被称为"进栈"(⼊栈或压栈);从栈中提取出指定元素,此过程被称为"出栈"(或弹栈);2.3 栈的具体实现栈是⼀种 "特殊" 的线性存储结构,因此栈的具体实现有以下两种⽅式:1. 顺序栈:采⽤顺序存储结构可以模拟栈存储数据的特点,从⽽实现栈存储结构。

栈是一种特殊的线性表,其特殊指出在于栈的存储结构比较特殊

栈是一种特殊的线性表,其特殊指出在于栈的存储结构比较特殊

栈是一种特殊的线性表,特殊之处在于插入和删除操作的位置受到限制,若插入和删除操作只允许在线性表的一端进行,则是栈,特点是后进先出。

栈的抽象数据模型:栈(stack)是一种特殊的线性表,其插入和删除操作只允许在线性表的一端进行,允许操作的一端称为栈顶(top)不允许操作的一端称谓栈底(Bottom),栈中插入元素操作称为入栈(push),删除元素的操作称为出栈(pop),没有元素的栈称为空栈、例如对数据序列{A,B,C,D}执行操作序列{入栈,出栈,入栈,入栈,出栈,出栈。

出栈},出栈序列为{B,D,C,A}栈机器状态如图:由于栈的插入和删除操作只允许在栈顶进行,每次入栈元素即成为栈顶元素,每次出栈元素总是最后一个入栈元素,因此栈的特点是后进先出(Last In First Out),就像一落盘子,每次将只有一个盘子在最上面,从最上面取走一个盘子,不能从中间插入或者插出。

栈的基本操作有创建栈,判断是否为空,入栈,出栈,和取出栈顶元素等。

栈不支持对指定位置的插入,删除等。

顺序栈采用顺序存储结构的栈称为顺序栈{Sequential Stack},声明顺序栈如下,实现栈接口,使用顺序表作为成员变量实现栈,约定null不能入栈。

其中,入栈和出栈操作实现为顺序表尾部插入和尾部删除,时间复杂度为O(1),顺序表的插入方法已经实现自动扩充数组容量,当需要扩充容量时,入栈的时间复杂度为O(n)栈和线性表是不同的数据抽象类型,栈概念不依赖于线性表而存在,我们只是使用顺序表进行设计,也可以使用数组实现。

链式栈采用连式存储结构的栈称为链式栈(Linked Stack),单链表结构的链式栈及入栈,出栈操作如图,设单链表(不带头节点)头指针top指向第一个元素节点(栈顶),入栈操作是头插入,在栈顶节点之前插入节点,出栈操作是头删除,删除栈顶节点并返回栈顶元素,再使top指向新的栈顶节点。

声明链式栈类如下,实现栈接口。

使用单链表作为成员变量实现栈。

数据结构第六次课-栈和队列B

数据结构第六次课-栈和队列B
例4:表达式求值
设计思路:用栈暂存运算符
第4页
❖回文游戏:顺读与逆读字符串一样(不含空格)
1.读入字符串
d
top 2.压入栈
a
3.原串字符与出栈字符依次比较
d
若不等,非回文
字符串:“madam I madam”
若直到栈空都相等,则是回文
“上海自来水来自海上” 有没有更简洁的办法呢?
(读入字符串,压入n/2个字符,n为字符个数)
第8页
表达式表示法
算术表达式中最常见的表示法形式有 中缀、前缀
和 后缀表示法。中缀表示法是书写表达式的常见方式,
而前缀和后缀表示法主要用于计算机科学领域。
➢中缀表示法 Syntax: operand1 operator operand2 Example: (A+B)*C-D/(E+F) ➢前缀表示法 -波兰表示法(Polish notation,PN) Syntax : operator operand1 operand2 Example : -*+ABC/D+EF ➢后缀表示法 -逆波兰表示法(Reverse Polish Notation,RPN) Syntax : operand1 operand2 operator Example : AB+C*DEF+/- 无操作符优先级问题,求值简单
第7页
❖ 表达式求值( 这是栈应用的典型例子 )
这里,表达式求值的算法是 “算符优先法”。
例如:3*(7 – 2 ) (1) 要正确求值,首先了解算术四则运算的规则:
a. 从左算到右 b. 先乘除,后加减 c. 先括号内,后括号外 由此,通常此表达式的计算顺序为:
3*(7 – 2 )= 3 * 5 = 15

数据结构第3章栈

数据结构第3章栈
Elemtype pop(sqstack *s) { /*若栈s不为空,则删除栈顶元素*/ Elemtype x; if(s->top<0) return NULL; /*栈空*/ x=s->stack[s->top]; s->top--; return x; }
13
(4)取栈顶元素操作
Elemtype gettop(sqstack *s) { /*若栈s不为空,则返回栈顶元素*/ If(s->top<0) return NULL; /*栈空*/ return (s->stack[s->top]); }

29
算术表达式求值
在计算机中,任何一个表达式都是由: 操作数(operand)、运算符(operator)和 界限符(delimiter)组成的。 其中操作数可以是常数,也可以是变量或常量的 标识符;运算符可以是算术运算体符、关系运算符和 逻辑符;界限符为左右括号和标识表达式结束的结束 符。
30
6
存储结构
栈是一种特殊的线性表,有两种存储方式: 顺序存储结构存储
链式存储结构存储。


7
顺序栈的数组表示
与第二章讨论的一般的顺序存储结构的线性表 一样,利用一组地址连续的存储单元依次存放自 栈底到栈顶的数据元素,这种形式的栈也称为顺 序栈。 使用一维数组来作为栈的顺序存储空间。 设指针top指向栈顶元素的当前位置,以数组 小下标的一端作为栈底。 top=0时为空栈,元素进栈时指针top不断地 加1,当top等于数组的最大下标值时则栈满。
5)假如读出的运算符的优先级不大于运算符栈栈顶运算符
的优先级,则从操作数栈连续退出两个操作数,从运算符栈中 退出一个运算符,然后作相应的运算,并将运算结果压入操作 数栈。此时读出的运算符下次重新考虑(即不读入下一个符号 )。

吉林大学数据结构_堆栈、队列


链式栈——入栈算法
算法Push(item)
/*向栈顶指针为top的链式栈中压入一个元素item*/
P1. [创建新结点]
s<=AVAIL. data(s) ←item. next(s) ←top.
P2. [更新栈顶指针]
top ←s. ▍
链式栈——出栈算法
算法Pop(.item)
/*从栈顶指针为top的链式栈中弹出栈顶元素,并存放在变量 item中*/
链式队列——存取队首元素
算法QFront(.item) /*读取队首元素值并将其存入item*/ QD1.[队列空?] if front=null then (print “队空”. Return.) QD2.[存取] item ← data(front). ▍
P1. [栈空?]
IF top=NULL THEN (PRINT “栈空无法弹出”. RETRUN.)
P2. [出栈]
item ←data(top). q ←next(top). AVAIL<=top. top ←q. ▍
链式栈——存取栈顶元素
算法Peek(.item) /*将栈顶指针为top的链式栈的栈顶元素存放 在变量item中*/ P1. [栈空?] IF top=NULL THEN (PRINT “栈空”. RETRUN.) P2. [存取栈顶] item ←data(top). ▍
链式栈——栈清空
算法Clear() /*将栈顶指针为top的链式栈清空*/ C1. [逐一出栈,直至栈空] WHILE top≠NULL DO ( q ←next(top). AVAIL<=top. top ←q. )▍
顺序栈与链式栈的比较-1
• 空间复杂性:

十进制转二进制(顺序栈设计和应用)

⼗进制转⼆进制(顺序栈设计和应⽤)设计⼀个顺序栈,并利⽤该顺序栈将给定的⼗进制整整数转换为⼆进制并输出。

函数接⼝定义:#define MaxSize 100 /* 栈最⼤容量 */int top; /* 栈顶指针 */int mystack[MaxSize]; /* 顺序栈 *//*判栈是否为空,空返回true,⾮空返回false */bool isEmpty();/* 元素x⼊栈 */void Push(int x);/* 取栈顶元素 */int getTop();/* 删除栈顶元素 */void Pop();其中 MaxSize 和 top 分别为栈的最⼤容量和栈顶指针。

数组mystack ⽤来模拟顺序栈。

请实现给出的isEmpty、Push、getTop和Pop这四个函数。

裁判测试程序样例:#include <bits/stdc++.h>using namespace std;#define MaxSize 100 /* 栈最⼤容量 */int top; /* 栈顶指针 */int mystack[MaxSize]; /* 顺序栈 *//*判栈是否为空,空返回true,⾮空返回false */bool isEmpty();/* 元素x⼊栈 */void Push(int x);/* 取栈顶元素 */int getTop();/* 删除栈顶元素 */void Pop();/* ⼗进制正整数转换为⼆进制 */void dec2bin(int x) {top = -1; /* 初始化栈顶指针 */while (x) {Push(x % 2);x >>= 1;}while (!isEmpty()) {int t = getTop();Pop();printf("%d", t);}printf("\n");}int main(int argc, char const *argv[]){int n;while (scanf("%d", &n) != EOF) {dec2bin(n);}return 0;}/* 请在这⾥填写答案 */输⼊样例:10结尾⽆空⾏输出样例:1010结尾⽆空⾏Answer/*判栈是否为空,空返回true,⾮空返回false */bool isEmpty() {if(top == -1)//如果栈顶指针是-1则没有元素为空return true;elsereturn false;};/* 元素x⼊栈 */void Push(int x) {if(top+1 > MaxSize) {//栈顶指针是指向栈顶元素上⼀个位置,则只要栈顶指针+1⼤于顺序栈数组最⼤数则栈满 printf("栈已满!");return;}if(top == -1) {mystack[++top] = x;//如果是空栈,需要让栈顶指针先加⼀指向0,再⼊栈top++;//栈顶指针是指向栈顶元素上⼀个位置,则还需要再加⼀}else{mystack[top++] = x;//其他情况则只⽤先⼊栈后,栈顶指针再加⼀即可}};/* 取栈顶元素 */int getTop() {return mystack[top-1];//栈顶指针减⼀的位置即为栈顶元素};/* 删除栈顶元素 */void Pop() {if(top == 1)top = -1;//如果只剩⼀个元素,只⽤让栈顶指针为-1即可elsetop--;//其他情况只要栈顶指针减⼀即可};。

ACCESS公共基础-栈和列队

特殊线性表特殊线性表特殊线性表例:有三个元素按栈的逻辑结构例:有三个元素按栈的逻辑结构例:有三个元素按栈的逻辑结构例:有三个元素按栈的逻辑结构栈的顺序存储结构及实现0 1 2 3 4 5 6 7栈的顺序存储结构及实现链栈:栈的链式存储结构及实现操作接口:链栈的实现操作接口:链栈的实现顺序栈和链栈的比较特殊线性表素出队时,头指针加1。

故在非空队列中,头指针始终指向队头元素前例:队列的顺序存储结构及实现(顺序队列)队列的顺序存储结构及实现(顺序队列)队列的顺序存储结构及实现(顺序队列)例:队列的顺序存储结构及实现(顺序队列)队列的顺序存储结构及实现(顺序队列)队列的顺序存储结构及实现(顺序队列)队列的顺序存储结构及实现(顺序队列)队列的顺序存储结构及实现(顺序队列)继续入队会出现什么情况?队列的顺序存储结构及实现(顺序队列)如何解决假溢出?队列的顺序存储结构及实现(顺序队列)如何实现循环队列?队列的顺序存储结构及实现(顺序队列)如何判断循环队列队空?队空的临界状态队列的顺序存储结构及实现(顺序队列)如何判断循环队列队空?执行出队操作队列的顺序存储结构及实现(顺序队列)如何判断循环队列队空?执行出队操作队列的顺序存储结构及实现(顺序队列)如何判断循环队列队满?队满的临界状态队列的顺序存储结构及实现(顺序队列)如何判断循环队列队满?执行入队操作队列的顺序存储结构及实现(顺序队列)如何判断循环队列队满?执行入队操作队列的顺序存储结构及实现(顺序队列)队空、队满的判定条件出现二义性。

队列的顺序存储结构及实现(顺序队列)链队列:head队列的链式存储结构及实现(链队列)非空链队列front∧队列的链式存储结构及实现(链队列)front∧队列的链式实现队列的链式实现循环队列和链队列的比较pfront。

《数据结构严蔚敏》PPT课件

第3章 栈和队列
栈和队列是两种应用非常广泛的数据结构,它们都 来自线性表数据结构,都是“操作受限”的线性表。
栈在计算机的实现有多种方式:
◆ 硬堆栈:利用CPU中的某些寄存器组或类似的硬 件或使用内存的特殊区域来实现。这类堆栈容量有限, 但速度很快;
◆ 软堆栈:这类堆栈主要在内存中实现。堆栈容量 可以达到很大。在实现方式上,又有动态方式和静态 方式两种。
采用静态一维数组来存储栈。
栈底固定不变的,而栈顶则随着进栈和退栈操作变 化的,
◆ 栈底固定不变的;栈顶则随着进栈和退栈操作而 变化,用一个整型变量top(称为栈顶指针)来指示当 前栈顶位置。
◆ 用top=0表示栈空的初始状态,每次top指向栈顶 在数组中的存储位置。
◆ 结点进栈:首先执行top加1,使top指向新的栈
3 压栈(元素进栈)
Status push(SqStack S , ElemType e)
{ if (S.top-S.bottom>=S. stacksize-1)
{ S.bottom=(ElemType *)realloc((S. STACKINCREMENT+STACK_SIZE) *sizeof(ElemType)); /* 栈满,追加存储空间 */
本章将讨论栈和队列的基本概念、存储结构、基本 操作以及这些操作的具体实现。
3.1 栈
3.1.1 栈的基本概念
1 栈的概念
栈(Stack):是限制在表的一端进行插入和删除操
作的线性表。又称为后进先出LIFO (Last In First Out) 或先进后出FILO (First In Last Out)线性表。
顶位置,然后将数据元素保存到栈顶(top所指的当前 位置)。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一 顺序栈的实现 #define maxsize 6 /*顺序栈的容量*/ typedef struct { ElementType data[maxsize]; int top; }SqStackTp; 顺序栈被定义为一个结构类型,它有两个域data和top。data为一个一维数组,用于存储栈中元素,DataType为栈元素的数据类型(有待设定)。top为int型,它的取值范围为0..sqstack_maxsize-1。top=0表示栈空,top=sqstack_maxsize-1表示栈满。对于图3-2顺序栈sqstack_ maxsize应为6。

下面讨论栈的基本运算在顺序栈上的实现。

1.初始化: 初始化运算是将栈顶初始化为0;

int InitStack(SqStackTp *sq) { sq->top=0; return(1);} 2.进栈: 进栈的主要操作是:①栈顶下标加1;②将入栈元素放入到新的栈顶下标所指的位置上。

算法如下: int Push(SqStackTp *sq,DataType x) /*若栈未满,将元素x入栈sq中;

否则提示出错信息*/ { if(sq->top== maxsize-1) { error("栈满");return(0);} else { sq->top++; sq->data[sq->top]=x; return(1);} } 3.退栈:退栈先要将栈顶元素取出,由参数返回,并将栈顶减1。 int Pop(SqStackTp *sq,DataType *x); { if (sq->top==0) { error("下溢"); return(0);} else { *x=sq->data[sq->top]; sq->top--; return(1);} };

4.判栈空: int EmptyStack(SqStackTp *sq) /*若栈空返回1;否则返回0*/ { if (sq->top==0) return(1) else return(0); }

5.读栈顶元素: int GetTop(SqStackTp *sq,DataType *x) /*取栈顶元素,栈顶元素通过参数返回*/

{if (sq->top==0) return(0); else { *x=sq->data[sq->top]; return(1);} } 6.顺序栈应用举例(进栈与出栈) #include "stdio.h" #define ElementType char #define maxsize 40 typedef struct { ElementType data[maxsize]; int top; } SqStackTp; int InitStack(SqStackTp *sq) { sq->top=0; return(1);} int Push(SqStackTp *sq,DataType x) {if(sq->top== maxsize-1) { printf("栈满"); return(0);} else { sq->top++; sq->data[sq->top]=x; return(1);} } int Pop(SqStackTp *sq,DataType *x) { if (sq->top==0){ printf("下溢"); return(0);} else { *x=sq->data[sq->top]; sq->top--; return(1);} } int EmptyStack(SqStackTp *sq) {if (sq->top==0)return(1); else return(0); } /*主函数*/ void main( ) { SqStackTp sq; ElementType ch; InitStack(&sq); for (ch='A';ch<='A'+12;ch++) { Push(&sq,ch); printf("%c",ch);} printf("\n"); while(!EmptyStack(&sq)) { Pop(&sq,&ch);printf("%c",ch); } printf("\n"); } 运行结果:ABCDEFGHIJKLM MLKJIHGFEDCBA 二 链栈的实现 链栈类型定义如下: typedef struct node

{ ElementType data; struct node *next; } node;

node *LStackTp; 下面讨论栈的基本运算在链栈上的实现。 1.初始化:栈初始化的作用是设置一个空栈。而一个空的链栈可以用栈顶指针为NULL来表示。

void InitStack(LStackTp *ls) { *ls=NULL; } 2.进栈:进栈算法的基本步骤包括: ①申请一个新结点,并将x的值送入该结点的data域;

②将该结点链入栈中使之成为新的栈顶结点。 void Push(LStackTp *ls, ElementType x)

{ LStackTp p; p= /*申请一个新结点*/

p->data=(LStackTp)malloc(sizeof(node));x; /*元素的值填入新结点

的data域*/ p->next=*ls; /*原栈顶链入新结点的next域*/ *ls=p; /*新结点成为新的栈顶*/

}

3.退栈: 退栈算法的基本步骤包括: ①栈顶结点的data域的值由参数返回,并取下栈顶结点,让它的下一个结点成为新的栈顶;

②将取出的栈顶结点空间释放。 int Pop(LStackTp *ls, ElementType *x) /*栈顶元素通过参数返回,它的直接后继成为新的栈顶*/ { LStackTp p;

if((*ls)!=NULL) { p=*ls; *x=p->data; /*栈顶元素通过参数返回 */

*ls=p->next;/*原栈顶的下一个结点成为新的栈顶*/

free(p); /*释放原栈顶结点空间*/

return 1; }

else return 0; }

4.判栈空: int EmptyStack(LStackTp *ls) /*若栈为空 则返回值1,否则返回值0 */

{ if(*ls==NULL) return(1); else return(0);} 5.读栈顶元素:

int GetTop(LStackTp *ls, ElementType *x) /*取栈顶元素*/

{ if((*ls)!=NULL){ *x=(*ls)->data;return 1;} else return 0; } 6.链栈应用举例(进栈与出栈) 1) #include "stdio.h" #define ElementType char #define size sizeof(node) typedef struct { ElementType data; struct node *next; } node ;

node *LStackTp; void InitStack(LStackTp *ls) { *ls=NULL; } void Push(LStackTp *ls, ElementType x) { LStackTp p; p=(LStackTp)malloc(size); p->data=x; p->next=*ls; *ls=p; } int Pop(LStackTp *ls, ElementType *x) { LStackTp p; if((*ls)!=NULL) { p=*ls;*x=p->data;*ls=(*ls)->next; free(p);return(1); } else return(0); } int EmptyStack(LStackTp ls) { if(ls==NULL) return(1); else return(0); } void main() { LStackTp ls; ElementType ch; InitStack(ls); for (ch='A';ch<='A'+12;ch++) { Push(&ls,ch); printf("%c",ls->data);} printf("\n"); while(!EmptyStack(ls)) { Pop(&ls,&ch);printf("%c",ch); } printf("\n"); } 运行结果:ABCDEFGHIJKLM MLKJIHGFEDCBA

2)写一个算法,借助栈将一个带头结点的单链表倒置。 head ─ → 头 ─ → a1 ─ → a2 ─ → ...... → an NULL

分析:这里可利用栈的特征,先沿着链表从头至尾扫描一遍,将链表的每个结点的data域的值依次进栈,然后再沿着链表从头至尾扫描一遍,同时栈中元素依次出栈,并填入到链表的每个结点的data域中。算法如下: void reverse_list(LkListTp *head)

相关文档
最新文档