实验一一个顺序栈的基本运算实验
栈的实验报告结论(3篇)
第1篇一、实验目的1. 理解栈的基本概念和操作;2. 掌握栈的顺序存储和链式存储实现方法;3. 熟悉栈在程序设计中的应用。
二、实验内容1. 栈的顺序存储结构实现;2. 栈的链式存储结构实现;3. 栈的基本操作(入栈、出栈、判空、求栈顶元素);4. 栈在程序设计中的应用。
三、实验方法1. 采用C语言进行编程实现;2. 对实验内容进行逐步分析,编写相应的函数和程序代码;3. 通过运行程序验证实验结果。
四、实验步骤1. 实现栈的顺序存储结构;(1)定义栈的结构体;(2)编写初始化栈的函数;(3)编写入栈、出栈、判空、求栈顶元素的函数;(4)编写测试程序,验证顺序存储结构的栈操作。
2. 实现栈的链式存储结构;(1)定义栈的节点结构体;(2)编写初始化栈的函数;(3)编写入栈、出栈、判空、求栈顶元素的函数;(4)编写测试程序,验证链式存储结构的栈操作。
3. 栈在程序设计中的应用;(1)实现一个简单的四则运算器,使用栈进行运算符和操作数的存储;(2)实现一个逆序输出字符串的程序,使用栈进行字符的存储和输出;(3)编写测试程序,验证栈在程序设计中的应用。
五、实验结果与分析1. 顺序存储结构的栈操作实验结果:(1)入栈操作:在栈未满的情况下,入栈操作成功,栈顶元素增加;(2)出栈操作:在栈非空的情况下,出栈操作成功,栈顶元素减少;(3)判空操作:栈为空时,判空操作返回真,栈非空时返回假;(4)求栈顶元素操作:在栈非空的情况下,成功获取栈顶元素。
2. 链式存储结构的栈操作实验结果:(1)入栈操作:在栈未满的情况下,入栈操作成功,链表头指针指向新节点;(2)出栈操作:在栈非空的情况下,出栈操作成功,链表头指针指向下一个节点;(3)判空操作:栈为空时,判空操作返回真,栈非空时返回假;(4)求栈顶元素操作:在栈非空的情况下,成功获取栈顶元素。
3. 栈在程序设计中的应用实验结果:(1)四则运算器:成功实现加、减、乘、除运算,并输出结果;(2)逆序输出字符串:成功将字符串逆序输出;(3)测试程序:验证了栈在程序设计中的应用。
栈及其应用实验报告
一、实验目的1. 理解栈的定义、特点、逻辑结构及其在计算机科学中的应用。
2. 掌握顺序栈和链栈的存储结构及基本操作实现。
3. 通过具体应用实例,加深对栈的理解,提高问题分析和解决的能力。
二、实验内容1. 实现顺序栈和链栈的基本操作。
2. 编写一个算法,判断给定的字符序列是否为回文。
3. 编写一个算法,利用栈的基本运算将指定栈中的内容进行逆转。
4. 给定一个整数序列,实现一个求解其中最大值的递归算法。
三、实验步骤1. 实现顺序栈和链栈的基本操作(1)顺序栈的存储结构及操作实现顺序栈使用数组来实现,其基本操作包括:- 初始化栈:使用数组创建一个空栈,并设置栈的最大容量。
- 入栈:将元素插入栈顶,如果栈满,则返回错误。
- 出栈:从栈顶删除元素,如果栈空,则返回错误。
- 获取栈顶元素:返回栈顶元素,但不删除。
- 判断栈空:判断栈是否为空。
(2)链栈的存储结构及操作实现链栈使用链表来实现,其基本操作包括:- 初始化栈:创建一个空链表,作为栈的存储结构。
- 入栈:在链表头部插入元素,如果链表为空,则创建第一个节点。
- 出栈:删除链表头部节点,如果链表为空,则返回错误。
- 获取栈顶元素:返回链表头部节点的数据。
- 判断栈空:判断链表是否为空。
2. 判断字符序列是否为回文编写一个算法,判断给定的字符序列是否为回文。
算法步骤如下:(1)使用顺序栈或链栈存储字符序列。
(2)从字符序列的头部开始,依次将字符入栈。
(3)从字符序列的尾部开始,依次将字符出栈,并与栈顶元素比较。
(4)如果所有字符均与栈顶元素相等,则字符序列为回文。
3. 利用栈的基本运算将指定栈中的内容进行逆转编写一个算法,利用栈的基本运算将指定栈中的内容进行逆转。
算法步骤如下:(1)创建一个空栈,用于存储逆转后的栈内容。
(2)从原栈中依次将元素出栈,并依次入新栈。
(3)将新栈的内容赋值回原栈,实现栈内容的逆转。
4. 求解整数序列中的最大值给定一个整数序列,实现一个求解其中最大值的递归算法。
栈的建立实验报告
一、实验目的本次实验旨在通过编程实现栈的顺序存储结构和链式存储结构,并熟练掌握栈的基本操作,包括栈的建立、入栈、出栈、取栈顶元素、判栈空等。
通过实验,加深对栈这一数据结构的理解,提高数据结构在实际问题中的应用能力。
二、实验内容1. 顺序栈的建立与基本操作(1)顺序栈的建立顺序栈使用一维数组来实现,其大小为栈的最大容量。
在建立顺序栈时,需要初始化栈顶指针top为-1,表示栈为空。
(2)顺序栈的基本操作① 入栈操作(Push)当栈未满时,将新元素插入到栈顶,同时栈顶指针top加1。
② 出栈操作(Pop)当栈非空时,将栈顶元素出栈,同时栈顶指针top减1。
③ 取栈顶元素操作(GetTop)当栈非空时,返回栈顶元素。
④ 判栈空操作(IsEmpty)当栈顶指针top为-1时,表示栈为空。
2. 链式栈的建立与基本操作(1)链式栈的建立链式栈使用链表来实现,每个节点包含数据域和指针域。
在建立链式栈时,需要创建一个头节点,其指针域为空。
(2)链式栈的基本操作① 入栈操作(Push)当栈为空时,创建新节点作为栈顶节点;当栈非空时,将新节点插入到头节点的下一个节点,同时修改头节点的指针域。
② 出栈操作(Pop)当栈非空时,删除头节点的下一个节点,同时修改头节点的指针域。
③ 取栈顶元素操作(GetTop)当栈非空时,返回头节点的下一个节点的数据域。
④ 判栈空操作(IsEmpty)当头节点的指针域为空时,表示栈为空。
三、实验步骤1. 编写顺序栈和链式栈的建立函数。
2. 编写顺序栈和链式栈的基本操作函数。
3. 编写测试程序,验证顺序栈和链式栈的基本操作。
四、实验结果与分析1. 顺序栈实验结果通过编写顺序栈的建立和基本操作函数,成功实现了顺序栈的入栈、出栈、取栈顶元素、判栈空等操作。
在测试程序中,依次进行入栈、出栈、取栈顶元素等操作,均能正确执行。
2. 链式栈实验结果通过编写链式栈的建立和基本操作函数,成功实现了链式栈的入栈、出栈、取栈顶元素、判栈空等操作。
数据结构实验报告 顺序栈
《数据结构与算法》实验报告一、实验内容1.栈的实现2.顺序栈的基本操作二、实验目的及要求熟悉栈的基本操作在顺序栈的实现。
通过具体应用实例在复习高级编程语言使用方法的基础上初步了解数据结构的应用。
三、设计分析与算法描述顺序栈的存储结构:typedef struct{int elem[Stack_Size];int top;}SeqStack;void InitStack(SeqStack *S)//构造一个空栈(初始化)int Push(SeqStack *S,int x)//进栈int Pop(SeqStack *S,int *x)//出栈int IsEmpty(SeqStack *S)//判栈是否空int IsFull(SeqStack *S)//判栈是否满int GetTop(SeqStack *S,int *x)//读栈顶四、附件:带注释的源程序#include"iostream.h"#define Stack_Size 50#define false 0#define true 1typedef struct{int elem[Stack_Size];int top;}SeqStack;void InitStack(SeqStack *S)//构造一个空栈(初始化) {S->top=-1;}int Push(SeqStack *S,int x)//进栈{if(S->top==Stack_Size-1)//栈已满return (false);S->top++;S->elem[S->top]=x;return (true);}int Pop(SeqStack *S,int *x)//出栈{if(S->top==-1)//栈已空return (false);else{*x=S->elem[S->top];S->top--;return (true);}}int IsEmpty(SeqStack *S)//判栈是否空{if(S->top==-1)return (true);elsereturn (false);}int IsFull(SeqStack *S)//判栈是否满{if(S->top==Stack_Size-1)return (true);elsereturn (false);}int GetTop(SeqStack *S,int *x)//读栈顶{if(S->top==-1)return (false);else{*x=S->elem[S->top];return (true);}}int main(){int i,temp;SeqStack st;InitStack(&st);for(i=0;i<10;i++)Push(&st,i);while(IsEmpty(&st)){Pop(&st,&temp);cout<<temp<<endl;}return 0;}。
栈的基本操作实验报告
栈的基本操作实验报告
《栈的基本操作实验报告》
实验目的:
通过本次实验,我们旨在掌握栈的基本操作,包括入栈、出栈、获取栈顶元素
等操作,并理解栈的特点和应用场景。
实验内容:
1. 入栈操作:将元素依次压入栈顶;
2. 出栈操作:从栈顶弹出元素;
3. 获取栈顶元素:不改变栈的状态,获取栈顶元素的值;
4. 判断栈空:判断栈是否为空;
5. 判断栈满:判断栈是否已满。
实验步骤:
1. 初始化一个栈;
2. 将元素依次入栈;
3. 依次进行出栈操作,观察栈的变化;
4. 获取栈顶元素,并进行判断栈空和栈满操作。
实验结果:
经过实验,我们成功掌握了栈的基本操作。
我们发现栈具有后进先出(LIFO)
的特点,适合于一些需要后续处理的数据结构,比如递归函数调用、表达式求
值等场景。
同时,我们也发现了栈的容量限制,需要在使用时注意栈是否已满。
结论:
栈是一种非常重要的数据结构,掌握了栈的基本操作能够帮助我们更好地理解
和应用它。
通过本次实验,我们对栈的特点和应用场景有了更深入的了解,相信在今后的学习和工作中能够更好地运用栈来解决问题。
栈的基本操作实验报告
一、实验目的1. 掌握栈的定义、特点、逻辑结构,理解栈的抽象数据类型。
2. 熟练掌握顺序栈和链栈两种结构类型的定义、特点以及基本操作的实现方法。
3. 了解栈在解决实际问题中的应用。
二、实验内容1. 编写顺序栈和链栈的基本操作函数,包括入栈(push)、出栈(pop)、判断栈空(isEmpty)、获取栈顶元素(getTop)等。
2. 利用栈实现字符序列是否为回文的判断。
3. 利用栈实现整数序列中最大值的求解。
三、实验步骤1. 创建顺序栈和链栈的结构体,并实现相关的基本操作函数。
2. 编写一个函数,用于判断字符序列是否为回文。
该函数首先将字符序列中的字符依次入栈,然后逐个出栈,比较出栈的字符是否与原序列相同,若相同则表示为回文。
3. 编写一个函数,用于求解整数序列中的最大值。
该函数首先将序列中的元素依次入栈,然后逐个出栈,每次出栈时判断是否为当前栈中的最大值,并记录下来。
四、实验结果与分析1. 顺序栈和链栈的基本操作函数实现如下:```c// 顺序栈的基本操作void pushSeqStack(SeqStack s, ElemType x) {if (s->top < MAXSIZE - 1) {s->top++;s->data[s->top] = x;}}void popSeqStack(SeqStack s, ElemType x) {if (s->top >= 0) {x = s->data[s->top];s->top--;}}bool isEmptySeqStack(SeqStack s) {return s->top == -1;}ElemType getTopSeqStack(SeqStack s) {if (s->top >= 0) {return s->data[s->top];}return 0;}// 链栈的基本操作void pushLinkStack(LinkStack s, ElemType x) {LinkStack p = (LinkStack )malloc(sizeof(LinkStack)); if (p == NULL) {exit(1);}p->data = x;p->next = s->top;s->top = p;}void popLinkStack(LinkStack s, ElemType x) { if (s->top != NULL) {LinkStack p = s->top;x = p->data;s->top = p->next;free(p);}}bool isEmptyLinkStack(LinkStack s) {return s->top == NULL;}ElemType getTopLinkStack(LinkStack s) {if (s->top != NULL) {return s->top->data;}return 0;}```2. 判断字符序列是否为回文的函数实现如下:```cbool isPalindrome(char str) {SeqStack s;initStack(&s);int len = strlen(str);for (int i = 0; i < len; i++) {pushSeqStack(&s, str[i]);}for (int i = 0; i < len; i++) {char c = getTopSeqStack(&s);popSeqStack(&s, &c);if (c != str[i]) {return false;}}return true;}```3. 求解整数序列中最大值的函数实现如下:```cint getMax(int arr, int len) {LinkStack s;initStack(&s);int max = arr[0];for (int i = 0; i < len; i++) {pushLinkStack(&s, arr[i]);if (arr[i] > max) {max = arr[i];}}while (!isEmptyLinkStack(&s)) {popLinkStack(&s, &max);}return max;}```五、实验心得通过本次实验,我对栈的基本操作有了更深入的理解。
顺序栈基本操作实验报告
数据结构实验三课程数据结构实验名称顺序栈基本操作第页专业班级学号姓名实验日期:年月日评分一、实验目的1.熟悉并能实现栈的定义和基本操作。
2.了解和掌握栈的应用。
二、实验要求1.进行栈的基本操作时要注意栈"后进先出"的特性。
2.编写完整程序完成下面的实验内容并上机运行。
3.整理并上交实验报告。
三、实验内容1.编写程序任意输入栈长度和栈中的元素值,构造一个顺序栈,对其进行清空、销毁、入栈、出栈以及取栈顶元素操作。
2.编写程序实现表达式求值,即验证某算术表达式的正确性,若正确,则计算该算术表达式的值。
主要功能描述如下:(1)从键盘上输入表达式。
(2)分析该表达式是否合法:•a) 是数字,则判断该数字的合法性。
若合法,则压入数据到堆栈中。
•b) 是规定的运算符,则根据规则进行处理。
在处理过程中,将计算该表达式的值。
•c) 若是其它字符,则返回错误信息。
(3)若上述处理过程中没有发现错误,则认为该表达式合法,并打印处理结果。
程序中应主要包含下面几个功能函数:•l void initstack():初始化堆栈•l int Make_str():语法检查并计算•l int push_operate(int operate):将操作码压入堆栈•l int push_num(double num):将操作数压入堆栈•l int procede(int operate):处理操作码•l int change_opnd(int operate):将字符型操作码转换成优先级•l int push_opnd(int operate):将操作码压入堆栈•l int pop_opnd():将操作码弹出堆栈•l int caculate(int cur_opnd):简单计算+,-,*,/•l double pop_num():弹出操作数四、实验步骤(描述实验步骤及中间的结果或现象。
在实验中做了什么事情,怎么做的,发生的现象和中间结果)第一题:#include <iostream>using namespace std;#define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量#define OVERFLOW -1#define OK 1#define NO -1#define NULL 0typedef int Status;typedef char SElemType;typedef struct{SElemType *base; //在栈构造之前和销毁之后,base的值为NULLSElemType *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;}//InitStackStatus StackEmpty(SqStack &S){if(S.base==S.top)return OK;elsereturn NO;}Status ClearStack (SqStack &S)//把S置为空{if(S.base=S.top);return OK;}Status DsetroyStack (SqStack &S)//销毁栈S{S.base=NULL;return OK;}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;}//PushStatus Pop(SqStack &S,SElemType &c)//若栈不空,则删除S的栈顶元素,用c返回其值,并返回OK;否则返回ERROR {if(S.top==S.base)return NO;c=*--S.top;return OK;}//PopStatus GetTop(SqStack &S,SElemType &e){if (S.top==S.base)return NO;e=*(S.top-1);return OK;}//GetTopint main(){SqStack S;Initstack(S);cout<<"输入要压到栈中的元素!"<<endl;char c;while((c=getchar())!='\n'){Push(S,c);}GetTop(S,c);cout<<"栈顶元素为:"<<c<<endl;//ClearStack (S);//DsetroyStack(S);for(int i=0;S.top!=S.base;i++){Pop(S,c);cout<<"栈中第"<<i+1<<"元素的值:";cout<<c<<endl;}return 0;}第二题:#include<iostream>using namespace std;#define STACK_SIZE 100#define STACKINCREMENT 10#define OVERFLOW -1#define OK 1#define NO 0typedef int Status;typedef char SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;}SqStack;int main(){char GetTop(SqStack &s);Status Initstack(SqStack &s);Status push_operate(SqStack &s,SElemType e);Status push_num(SqStack &s,int e);Status Stackempty(SqStack &s);Status pop_num(SqStack &s,int &c);Status pushoperate(SElemType operate);Status pushnum(SElemType num);Status caculate(SElemType a,SElemType operate,SElemType b);Status pop_operate(SqStack &s,SElemType &c);Status change(SElemType e);char Precede(SElemType a,SElemType b);char Operatecxz();int m;m=Operatecxz();cout<<m<<endl;return 0;}Status change(SElemType e){int m;m=e-48;return m;}Status Initstack(SqStack &s){s.base=(SElemType *)malloc(STACK_SIZE*sizeof(SElemType));if(!s.base)exit(OVERFLOW);s.top=s.base;s.stacksize=STACK_SIZE;return OK;}Status Stackempty(SqStack &s){if(s.base==s.top)return OK;elsereturn NO;}Status push_num(SqStack &s,int 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;}Status push_operate(SqStack &s,SElemType 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;}Status pop_operate(SqStack &s,SElemType &c){if(s.top==s.base)return NO;c=*--s.top;return OK;}Status pop_num(SqStack &s,int &c){if(s.top==s.base)return NO;c=*--s.top;return OK;}char GetTop(SqStack &s){char c;if(s.top==s.base)return NO;c=*(s.top-1);return c;}Status caculate(int a,SElemType operate,int b){int s;if(operate=='+')s=a+b;if(operate=='-')s=a-b;if(operate=='*')s=a*b;if(operate=='/')s=a/b;return s;}Status In(SElemType c){if(c=='+'||c=='-'||c=='*'||c=='/'||c=='#'||c=='('||c==')') return OK;if(c>='0'&&c<='9')return NO;return -1;}char Precede(SElemType a,SElemType b){if(a=='+'||a=='-'){if(b=='+'||b=='-'||b==')'||b=='#')return '>';if(b=='*'||b=='/'||b=='(')return '<';}if(a=='*'||a=='/'){if(b=='+'||b=='-'||b==')'||b=='*'||b=='/'||b=='#')return '>';if(b=='(')return '<';}if(a=='('){if(b==')')return '=';if(b=='+'||b=='-'||b=='*'||b=='/')return '<';if(b=='#')return ' ';}if(a==')'){if(b==')')return ' ';if(b=='+'||b=='-'||b=='*'||b=='/'||b=='('||b=='#')return '>';}if(a=='#'){if(b=='#')return '=';if(b=='+'||b=='-'||b=='*'||b=='/'||b=='(')return '<';if(b==')')return ' ';}return ' ';}char Operatecxz(){SqStack Operate,Num;char c,e,x;int num,a,b,flat=1,sz=0;Initstack(Operate);push_operate(Operate,'#');Initstack(Num);c=getchar();while(c!='#'||GetTop(Operate)!='#'){if(In(c)==-1){cout<<"input error!"<<endl;flat=0;break;}if(In(c)!=1){if(sz==0){num=change(c);sz=1;c=getchar();continue;}if(sz==1)num=num*10+change(c);c=getchar();continue;}else{if(sz==1)push_num(Num,num);sz=0;x=GetTop(Operate);switch(Precede(GetTop(Operate),c)){case '<':{push_operate(Operate,c);c=getchar();break;}case '=':{pop_operate(Operate,e);c=getchar();break;}case '>':{pop_num(Num,a);pop_operate(Operate,e);pop_num(Num,b);push_num(Num,caculate(b,e,a));break;}}}}pop_operate(Operate,e);if(e!='#')flat=0;if(flat==1){pop_num(Num,a);return a;}if(flat==0)return 0;}五.实验结果与讨论(描述最终得到的结果,并进行分析说明,可能的误差原因)第一题:1 把主函数中的ClearStack (S);DsetroyStack(S)注释掉的结果:2 不把ClearStack (S)注释掉,把栈清空:3 不把DsetroyStack(S)注释掉,即销毁栈:出现一堆乱码,说明销毁成功。
栈的操作(实验报告)
引言:栈是一种常见的数据结构,它具有特殊的操作规则,即先进后出(LIFO)。
本文将介绍栈的操作,并结合实验报告的方式详细阐述栈的概念、基本操作以及应用场景。
概述:栈是一种线性数据结构,由相同类型的元素按照特定顺序排列而成。
在栈中,只能在栈顶进行插入和删除操作,其他位置的元素无法直接访问。
栈具有两个基本操作:压栈(push)和弹栈(pop)。
其中,压栈将一个元素添加到栈顶,弹栈则是删除栈顶的元素。
除了基本操作外,栈还具有其他常见的操作,如获取栈顶元素(top)、判断栈是否为空(empty)等。
正文内容:一、栈的基本操作1.压栈(push)push操作的实现原理和步骤在实际应用中的使用场景和例子2.弹栈(pop)pop操作的实现原理和步骤在实际应用中的使用场景和例子3.获取栈顶元素(top)top操作的实现原理和步骤在实际应用中的使用场景和例子4.判断栈是否为空(empty)empty操作的实现原理和步骤在实际应用中的使用场景和例子5.栈的大小(size)size操作的实现原理和步骤在实际应用中的使用场景和例子二、栈的应用场景1.括号匹配使用栈实现括号匹配的原理和过程在编译器、计算表达式等领域中的应用2.浏览器的后退和前进功能使用栈来记录浏览器访问历史的原理和过程实现浏览器的后退和前进功能3.函数调用和递归使用栈来实现函数调用和递归的原理和过程在程序执行过程中的应用和注意事项4.实现浏览器缓存使用栈来实现浏览器缓存的原理和过程提高用户浏览速度的实际应用案例5.撤销操作使用栈来实现撤销操作的原理和过程在编辑器、图形处理软件等领域的实际应用总结:本文详细介绍了栈的操作,包括基本操作(压栈、弹栈、获取栈顶元素、判断栈是否为空、栈的大小)和应用场景(括号匹配、浏览器的后退和前进功能、函数调用和递归、实现浏览器缓存、撤销操作)。
通过了解栈的操作和应用,我们可以更好地理解数据结构中的栈,并能够在实际问题中灵活运用栈的特性。
数据结构实验报告顺序栈
(封面)学生实验报告学院:国际经贸学院课程名称:数据结构专业班级:09电子商务姓名:学号:学生实验报告(经管类专业用)一、实验目的及要求:1、目的通过实验,实现顺序栈的各种基本运算。
2、内容及要求编写一个程序,实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成下列功能:(1)初始化栈S。
(2)判断栈S是否非空。
(3)依次进栈元素a,b,c,d,e。
(4)判断栈S是否非空。
(5)输出栈的长度。
(6)输出从栈顶到栈底的元素。
(7)输出出栈序列;(8)判断链栈S是否为空;(9)释放链栈二、仪器用具:三、实验方法与步骤:一、查阅顺序栈等相关资料,熟悉顺序栈基本概念和流程二、“开展”顺序栈实验流程三、整理实验数据和文档,总结实验的过程,编写实验报告四、实验结果与数据处理:1、顺序栈的代码:#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct{ElemType data[MaxSize];int top; //栈顶指针} SqStack;void InitStack(SqStack *&s){s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}void ClearStack(SqStack *&s){free(s);}int StackLength(SqStack *s){return(s->top+1);}int StackEmpty(SqStack *s){return(s->top==-1);}int Push(SqStack *&s,ElemType e) {if (s->top==MaxSize-1)return 0;s->top++;s->data[s->top]=e;return 1;}int Pop(SqStack *&s,ElemType &e) {if (s->top==-1)return 0;e=s->data[s->top];s->top--;return 1;}int GetTop(SqStack *s,ElemType &e) {if (s->top==-1)return 0;e=s->data[s->top];return 1;}void DispStack(SqStack *s){int i;for (i=s->top;i>=0;i--)printf("%c ",s->data[i]);printf("\n");void main() {// 主函数SqStack S=(SqStack *)malloc(sizeof(SqStack)); printf("(1)初始化顺序栈\n");InitStack(S);printf("(2)判断顺序栈是否为空:\n"); StackEmpty(S);printf("(3)依次进栈元素a,b,c,d,e:\n");Push(S,'a');Push(S,'b');Push(S,'c');Push(S,'d');Push(S,'e');printf("(4)判断顺序栈是否为空:\n"); StackEmpty(S);printf("(5)输出栈长度:%d\n",StackLength(S)); printf("(6)输出从栈顶到栈底的元素:\n"); StackTraverse(S);printf("(7)读出栈顶元素:%d\n",GetTop(S,e));printf("(8)删除栈顶元素:%d\n",Pop(S,e));printf("(9)输出从栈顶到栈底的元素:\n");StackTraverse(S);printf("(10)判断顺序栈是否为空\n");StackEmpty(S);printf("(11)释放栈。
编译原理1一个顺序栈的基本运算
实验一一个顺序栈的基本运算实验[实验目的]对一个顺序栈的基本运算进行分析与设计,并上机运行。
使学生能通过实验对一个顺序栈的基本运算实现,为下一步的实验奠定基础。
[实验要求]要求对一个顺序栈的基本运算作设计性实验,并上机运行,写出实验报告。
[实验时数] 2学时。
[实验内容]一个顺序栈的数据类型表示和初始化、进栈、出栈基本运算。
[实验环境]Windows2000 visualstudio2008[算法描述及实验步骤]用C++ vector容器建立空栈,用户输入元素之后进行进栈、出栈、遍历栈、判别空栈等操作[调试过程][实验结果][调试过程][实验总结][附录]#include<iostream>using std::cin; using std::cout; using std::endl; #include<vector>using std::vector;int panbie(vector<int> stack){//判别空栈if(stack.empty()){cout << "此栈是空栈" << endl;return 0;}else{cout << "此栈不是空栈" << endl;return -1;}}int bianli(vector<int> stack){//循环遍历栈for(vector<int>::iterator a = stack.begin(); a != stack.end(); ++a) cout << *a << endl;return 0;}int main(){int temp;vector<int> stack;//进栈cout << "输入元素以结束" << endl;cin >> temp;while(temp != 9999){stack.push_back(temp);cin >> temp;}cout << "输入判别空栈,输入遍历栈" << endl;int a;cin >> a;if (a == 1)panbie(stack);else if(a == 2)bianli(stack);elsecout << "输入错误" << endl;int b;cin >> b;}[教师评语]。
栈的顺序实验报告
一、实验目的本次实验旨在使学生掌握栈的顺序存储结构,理解栈的基本操作,并能够通过编程实现栈的初始化、入栈、出栈、判空、取栈顶等基本功能。
同时,通过实验加深对数据结构中栈的应用理解,提高编程能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio三、实验内容1. 栈的顺序存储结构- 实现栈的顺序存储结构,包括定义栈的存储空间和栈顶指针。
- 设计栈的初始化、判空、入栈、出栈、取栈顶等基本操作。
2. 栈的基本操作- 编写代码实现栈的初始化函数,初始化栈的空间和栈顶指针。
- 实现判空函数,检查栈是否为空。
- 实现入栈函数,将元素添加到栈顶。
- 实现出栈函数,从栈顶移除元素。
- 实现取栈顶函数,获取栈顶元素但不移除。
3. 栈的应用- 利用栈实现十进制数与二进制数的转换。
- 利用栈实现函数调用栈,模拟函数调用的过程。
四、实验步骤1. 定义栈的结构体```ctypedef struct {int array; // 动态分配的数组,用于存储栈元素 int top; // 栈顶指针int maxSize; // 栈的最大容量} SeqStack;```2. 实现栈的基本操作- 初始化栈```cvoid InitStack(SeqStack s, int maxSize) {s->array = (int )malloc(sizeof(int) maxSize); s->top = -1;s->maxSize = maxSize;}```- 判空```cint IsEmpty(SeqStack s) {return s->top == -1;}```- 入栈```cint Push(SeqStack s, int x) {if (s->top == s->maxSize - 1) { return 0; // 栈满}s->array[++s->top] = x;return 1;}```- 出栈```cint Pop(SeqStack s, int x) {if (IsEmpty(s)) {return 0; // 栈空}x = s->array[s->top--];return 1;}```- 取栈顶```cint GetTop(SeqStack s, int x) {if (IsEmpty(s)) {return 0; // 栈空}x = s->array[s->top];return 1;}```3. 实现十进制数与二进制数的转换- 编写函数实现十进制数转换为二进制数,利用栈存储转换过程中的余数。
栈的顺序存储实验报告(3篇)
第1篇一、实验目的1. 理解栈的基本概念和顺序存储结构;2. 掌握顺序栈的初始化、进栈、出栈、读栈顶元素等基本操作;3. 通过实际编程实现顺序栈,并验证其功能。
二、实验内容1. 栈的基本概念栈是一种特殊的线性表,它只允许在一端进行插入和删除操作。
栈的插入和删除操作遵循“后进先出”(LIFO)的原则。
2. 顺序栈的定义顺序栈使用数组来存储栈中的元素,数组的大小定义为MaxSize。
栈顶指针top 指向栈顶元素。
3. 顺序栈的基本操作(1)初始化:将栈顶指针top设置为-1,表示栈为空。
(2)进栈:判断栈是否已满,如果未满,则将新元素放入栈顶,并将栈顶指针top加1。
(3)出栈:判断栈是否为空,如果栈不为空,则将栈顶元素弹出,并将栈顶指针top减1。
(4)读栈顶元素:判断栈是否为空,如果栈不为空,则返回栈顶元素。
(5)栈的销毁:释放栈所占用的内存空间。
4. 实验步骤(1)定义栈的最大容量MaxSize;(2)创建顺序栈结构体;(3)实现顺序栈的基本操作函数;(4)编写主函数,测试顺序栈的功能。
1. 定义栈的最大容量MaxSize为100;2. 创建顺序栈结构体,包含数组data和栈顶指针top;3. 实现顺序栈的基本操作函数,包括初始化、进栈、出栈、读栈顶元素和栈的销毁;4. 编写主函数,创建顺序栈,进行进栈、出栈、读栈顶元素等操作,并输出结果。
四、实验结果与分析1. 初始化顺序栈初始化顺序栈后,栈顶指针top为-1,表示栈为空。
2. 进栈操作当向顺序栈中进栈元素时,首先判断栈是否已满。
如果栈未满,则将新元素放入栈顶,并将栈顶指针top加1。
3. 出栈操作当从顺序栈中出栈元素时,首先判断栈是否为空。
如果栈不为空,则将栈顶元素弹出,并将栈顶指针top减1。
4. 读栈顶元素操作当读取栈顶元素时,首先判断栈是否为空。
如果栈不为空,则返回栈顶元素。
5. 栈的销毁当栈不再需要时,释放栈所占用的内存空间。
实验结果表明,顺序栈的基本操作能够正常进行,验证了顺序栈的正确性。
实现顺序栈的各种基本运算的算法实验原理
实现顺序栈的各种基本运算的算法实验原理一、引言顺序栈是一种常见的数据结构,它的特点是栈中元素的存储是连续的。
顺序栈的基本运算包括入栈、出栈、判空和获取栈顶元素等。
本文将详细介绍实现顺序栈各种基本运算的算法实验原理。
二、顺序栈的定义顺序栈是由一个一维数组和一个栈顶指针组成的数据结构。
栈顶指针指向栈顶元素的位置,当栈为空时,栈顶指针为-1;当栈满时,栈顶指针等于数组的长度减1。
三、顺序栈的入栈操作入栈操作是将一个元素压入栈中。
具体步骤如下:1. 判断栈是否已满,如果满则提示栈已满,无法进行入栈操作;2. 栈顶指针加1;3. 将待入栈的元素存入栈顶指针所指向的位置。
四、顺序栈的出栈操作出栈操作是将栈顶元素删除并返回。
具体步骤如下:1. 判断栈是否为空,如果为空则提示栈已空,无法进行出栈操作;2. 获取栈顶元素的值;3. 栈顶指针减1。
五、顺序栈的判空操作判空操作是判断栈是否为空。
具体步骤如下:根据栈顶指针的值来判断,如果栈顶指针为-1,则表示栈为空,否则表示栈非空。
六、顺序栈的获取栈顶元素操作获取栈顶元素操作是获取栈顶元素的值,但不删除。
具体步骤如下:1. 判断栈是否为空,如果为空则提示栈已空,无法获取栈顶元素;2. 获取栈顶元素的值。
七、顺序栈的算法实现下面以C语言为例,给出顺序栈的算法实现:1. 定义顺序栈的数据结构typedef struct {int top; // 栈顶指针int maxSize; // 栈的最大容量int* data; // 栈的数据存储区} SeqStack;2. 初始化顺序栈void initStack(SeqStack* stack, int maxSize) {stack->top = -1;stack->maxSize = maxSize;stack->data = (int*)malloc(maxSize * sizeof(int)); }3. 入栈操作void push(SeqStack* stack, int value) {if (stack->top == stack->maxSize - 1) {printf("栈已满,无法进行入栈操作\n");return;}stack->top++;stack->data[stack->top] = value;}4. 出栈操作int pop(SeqStack* stack) {if (stack->top == -1) {printf("栈已空,无法进行出栈操作\n");return -1;}int value = stack->data[stack->top];stack->top--;return value;}5. 判空操作int isEmpty(SeqStack* stack) {return stack->top == -1;}6. 获取栈顶元素操作int top(SeqStack* stack) {if (stack->top == -1) {printf("栈已空,无法获取栈顶元素\n");return -1;}return stack->data[stack->top];}八、实验原理1. 实验目的:通过实现顺序栈的各种基本运算,加深对顺序栈的理解,并掌握顺序栈的操作原理和算法实现。
顺序栈的实验报告
顺序栈的实验报告顺序栈的实验报告引言:顺序栈是一种常见的数据结构,它具有先进后出的特性,被广泛应用于计算机科学和软件工程领域。
本次实验旨在通过实际操作和观察,深入了解顺序栈的特点、操作和应用。
实验目的:1. 理解顺序栈的基本概念和特性;2. 掌握顺序栈的基本操作,包括入栈和出栈;3. 通过实验验证顺序栈的操作是否符合预期;4. 探索顺序栈在实际应用中的潜力和局限性。
实验过程:1. 实验环境准备:在本次实验中,我们使用C++语言编写程序来模拟顺序栈的操作。
实验环境包括一台计算机和一个集成开发环境(IDE),如Visual Studio等。
2. 顺序栈的定义:顺序栈是一种使用数组实现的栈结构,它具有固定大小和连续存储的特点。
栈顶指针指向栈顶元素,栈底指针指向栈底元素。
3. 顺序栈的基本操作:- 初始化栈:创建一个空栈,并初始化栈顶指针和栈底指针;- 判断栈是否为空:检查栈顶指针是否等于栈底指针;- 入栈操作:将元素插入到栈顶,并更新栈顶指针;- 出栈操作:删除栈顶元素,并更新栈顶指针;- 获取栈顶元素:返回栈顶元素的值,不修改栈的结构。
4. 实验步骤:- 步骤一:创建一个空栈;- 步骤二:依次将元素1、2、3入栈;- 步骤三:判断栈是否为空,并输出结果;- 步骤四:获取栈顶元素,并输出结果;- 步骤五:依次出栈,并输出结果。
实验结果:根据实验步骤和操作,我们得到以下结果:- 创建空栈成功;- 元素1、2、3成功入栈;- 栈非空,判断成功;- 获取栈顶元素为3,操作成功;- 依次出栈元素3、2、1,操作成功。
实验分析:通过实验结果可以看出,顺序栈的操作符合预期,各个操作均成功完成。
顺序栈的入栈和出栈操作都具有常数时间复杂度,即O(1),因为只需更新栈顶指针即可。
而判断栈是否为空和获取栈顶元素的操作也是常数时间复杂度。
这些特点使得顺序栈在实际应用中具有高效性和可靠性。
然而,顺序栈也存在一些局限性。
首先,顺序栈的大小是固定的,一旦栈满无法再插入新元素。
数据结构实验5顺序栈的基本操作
实验报告实验课程数据结构实验项目实验五、顺序栈的基本操作实验地点指导教师班级学生姓名学号教师评分日期一、实验目的1、掌握栈的顺序存储结构;2、掌握顺序栈及其基本操作的实现。
二、实验设备1.安装有WinXP的PC一台;2.安装有软件VC6或者Visual Studio2005。
三、实验内容1、建立的顺序栈相关数据结构;2、实现顺序栈的插入、删除、查找等基本操作;3、利用顺序栈实现数制的转换。
四、实验步骤1.定义表示整数的数据元素。
2.根据教材的内容,定义顺序栈的结构体。
3.根据教材的内容,编写代码,实现顺序栈的下列函数。
Status InitStack( SqStack &S) ;bool StackEmpty( SqStack S );int StackLength( SqStack S );Status ClearStack( SqStack S );Status DestroyStack( SqStack &S );Status Push( SqStack &S, SElemType e);Status Pop( SqStack &S, SElemType &e) ;Status GetTop( SqStack S, SElemType &e);4.根据教材48页的内容,实现十进制数N到8进制数据转换,将代码复制到下面。
5.改进/修改上述代码,实现十进制到8进制、2进制、16进制的转换,将代码复制到下面。
6.7.8.定义main函数,利用上述函数编写代码,实现下列数据到16进制、8进制、2进制的转换。
(将代码以及执行的过程截图到下面)876778657, 203498089, 49857, 21387,3099,34234.五、实验总结请写出本实验的心得体会。
实验一一个顺序栈的基本运算实验
实验一一个顺序栈的基本运算实验一、实验目的:对一个顺序栈的基本运算进行分析与设计,回顾数据结构所学过的知识,掌握一个顺序栈的基本运算实现,为下一步的实验奠定基础。
二、实验要求:要求对一个顺序栈的基本运算作设计性实验,并上机运行,撰写实验报告。
三、实验内容:一个顺序栈的数据类型表示和初始化、进栈、出栈基本运算。
四、实验环境:Windows XP + VC++6.0开发环境。
五、实验步骤:1、对顺序栈的知识进行复习,弄清楚栈的算法思想。
2、熟悉顺序栈的几种基本运算,即:(1)初始化栈int initStack(sqstack *s){/*创建一个空栈由指针S指出*/if ((s=(sqstack*)malloc(sizeof(sqstack)))= =NULL) return FALSE;s->top= -1;return TRUE;}(2)入栈操作int push(sqstack *s, Elemtype x){/*将元素x插入到栈s中,作为s的新栈顶*/if(s->top>=MAXNUM-1) return FALSE; /*栈满*/s->top++;s->stack[s->top]=x;return TRUE;}(3)出栈操作Elemtype pop(sqstack *s){/*若栈s不为空,则删除栈顶元素*/Elemtype x;if(s->top<0) return NULL; /*栈空*/x=s->stack[s->top];s->top--;return x;}(4)取栈顶元素操作Elemtype gettop(sqstack *s){/*若栈s不为空,则返回栈顶元素*/if(s->top<0) return NULL; /*栈空*/return (s->stack[s->top]);}取栈顶元素与出栈不同之处在于出栈操作改变栈顶指针top的位置,而取栈顶元素操作不改变栈的栈顶指针.(5)判栈空操作int Empty(sqstack *s){/*栈s为空时,返回为TRUE;非空时,返回为FALSE*/if(s->top<0) return TRUE;return FALSE;}(6)置空操作void setEmpty(sqstack *s){/*将栈s的栈顶指针top,置为-1*/s->top= -1;}3、上机调试。
实验七:顺序栈的基本操作
2、实验过程记录:
实验任务:通过栈结构,将从键盘输入的字符串逆置输出。
从键盘上输入:abcdef
程序输出:fedcba
步骤
1、顺序栈的建立
(1)顺序栈的类型定义。
(2)栈的初始化。
2、字符串的输入
(1)按字符逐个入栈(注意判断内存是否溢出)。
(2)可通过while等循环语句,结合getchar()实现。
else
return 0;
}
void GetTop(STACK *S,int *item) //获取栈顶元素
{
if (StackEmpty(S))
{
printf("Stack is empty\n");
return;
}
else
*item=S->item[S->top];
}
STACK * Push(STACK *S,char item) //入栈
char item[MAX_STACK];
//存放栈中数据元素的存储单元
int top; //栈顶指针
}STACK;
void INitStack(STACK *S)
{
S->top=-1;
}
int StackEmpty(STACK *S) //判断栈是否为空
{
if (S->top==-1)
return 1;
}
结果:
从键盘上输入:abcdef
程序输出:fedcba
三、实验小结:
实验报告成绩(百分制)__________实验指导教师签字:__________
{if (S->top==MAX_STACK-1)
实验3.1 实现顺序栈各种基本运算的算法
实验三实现顺序栈各种基本运算的算法1.实验目的(1)掌握栈的定义、出入栈的方法及基本操作。
(2)掌握将算法在VC++6.0语言环境下实现的过程。
2.实验准备(1)复习栈的定义,掌握出入栈的方法及操作。
(2)复习C语言中数组及结构体的概念、定义方式。
(3)实验的计算机中安装了Microsoft VC++ 6.0。
3.实验内容与要求编写一个控制台程序实现顺序栈的各种基本运算,并在此基础上设计一个主程序完成如下功能:(1)初始化栈s。
(2)判断栈s是否非空。
(3)依次进栈元素a,b,c,d,e。
(4)判断栈s是否非空。
(5)输出栈长度。
(6)输出从栈顶到栈底的元素。
(7)输出出栈序列。
(8)判断栈s是否非空。
(9)释放栈。
下列是上述程序部分代码,部分函数未实现。
补充完成下列程序。
#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct{ElemType elem[MaxSize];int top; /*栈指针*/} SqStack;void InitStack(SqStack *&s)///初始化栈s{s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;}void ClearStack(SqStack *&s)///释放栈s{}int StackLength(SqStack *s)///求栈s长度{}int StackEmpty(SqStack *s)///判断栈s是否为空栈{}int Push(SqStack *&s,ElemType e)///进栈元素e{return 1;}int Pop(SqStack *&s,ElemType &e)///出栈一个元素{return 1;}int GetTop(SqStack *s,ElemType &e)///取栈顶元素{return 1;}void DispStack(SqStack *s)///从栈顶到栈底输出元素{}////////////////////////////////////////////////////#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct{ElemType elem[MaxSize];int top; /*栈指针*/} SqStack;extern void InitStack(SqStack *&s);extern void ClearStack(SqStack *&s);extern int StackLength(SqStack *s);extern int StackEmpty(SqStack *s);extern int Push(SqStack *&s,ElemType e);extern int Pop(SqStack *&s,ElemType &e);extern int GetTop(SqStack *s,ElemType &e);extern void DispStack(SqStack *s);void main(){ElemType e;SqStack *s;printf("(1)初始化栈s\n");InitStack(s);printf("(2)栈为%s\n",(StackEmpty(s)?"空":"非空"));printf("(3)依次进栈元素a,b,c,d,e\n");Push(s,'a');Push(s,'b');Push(s,'c');Push(s,'d');Push(s,'e');ClearStack(s);}。
数据结构实验-栈的基本运算
*******************************实验题目:栈的基本运算实验者信息:班级13007102,姓名庞文正,学号1300710226实验完成的时间3:00******************************一、实验目的1,掌握栈的各种存储结构及基本运算的实现。
2,掌握堆栈后进先出的运算原则在解决实际问题中的应用。
3,复习c语言中相关语句及函数的用法。
二、实验内容括号配对检查。
试设计一个程序对任意输入的语句或数学表达式,判断其括号是否匹配。
若匹配,则返回1,否则返回0。
调试程序并对相应的输出作出分析;修改输入数据,预期输出并验证输出的结果。
加深对算法的理解。
三、算法设计与编码1.本实验用到的理论知识总结本实验用到的理论知识,实现理论与实践相结合。
总结尽量简明扼要,并与本次实验密切相关,最好能加上自己的解释。
2.算法概要设计给出实验的数据结构描述,程序模块、功能及调用关系首先建立一个栈结构,且初始化栈为空。
然后由键盘上随即输入一个带括号的语句或带括号的数学表达式,同时将它们保存在一个字符型数组exps[]中。
扫描表达式exps,当遇到“(”、“[”、“{”时,将其入栈。
遇到“)”、“]”、“}”时,判断栈顶是否有相匹配的括号。
若没有,则退出扫描过程,返回0,否则直到exps扫描完毕为止。
若top为0,则返回1。
#include<stdio.h>#define MAXSIZE 100#define TRUE 1#define FALSE 0typedef int datatype;typedef struct //顺序栈的结构体定义{datatype stack[MAXSIZE];int top;}seqstack;void setnull(seqstack *s) //置空栈-由于c语言的数组下标是从0开始的,所以置{s->top=-1;} // {s->top=-1;} 空栈操作时将栈顶指针放在下标为0之前,即-1处。
数据结构顺序栈实验报告参考模板
一、设计人员相关信息1.设计者姓名、学号和班号:12地信李晓婧120122429832.设计日期:2014.3.上机环境:VC++6.0二、程序设计相关信息1.实验题目:编写一个程序,实现顺序栈(假设栈中元素类型为char)的各种基本运算,并在此基础上设计一个程序,完成如下功能:(1)初始化栈(2)判断栈是否为空(3)依次进栈元素a,b,c,d,e(4)判断栈是否为空(5)输出栈长度(6)输出从栈顶到栈底元素(7)输出出栈序列(8)判断栈是否为空(9)释放栈2.实验项目组成:栈的初始化、销毁、判断是否为空、进栈、出栈、取栈顶元素。
3.实验项目的程序结构(程序中的函数调用关系图):4.实验项目包含的各个文件中的函数的功能描述:(1)初始化栈InitStack:建立一个新的空栈,实际上将栈顶指针指向-1即可。
(2)销毁栈DestroyStack:释放栈占用的存储空间(3)判断栈是否为空StackEmpty:栈为空的条件是s->op==-1。
(4)进栈Push:在栈不满的条件下,先将栈顶指针增1,然后在栈顶指针指向位置插入元素e。
(5)出栈Pop:在栈不为空的条件下,先将栈顶元素赋给e,然后将栈顶指针减1.(6)取栈顶元素GetTop:在栈不为空的条件下,将栈顶元素赋给e。
5.算法描述或流程图:#include "stdio.h"#include "malloc.h"#include<stdlib.h>#define MaxSize 50typedef char ElemType;typedef struct{ElemType data[MaxSize];int top; /*栈顶指针*/}SqStack; //定义顺序栈类型void InitStack(SqStack*&s)/*初始化*/{s=(SqStack*)malloc(sizeof(SqStack));s->top=-1; //栈顶指针置为-1}void DestroyStack(SqStack *&s)/*销毁*/{free(s);}int StackEmpty(SqStack*s)/*判断是否为空*/{return(s->top==-1);}int push(SqStack *&s,ElemType a[],int n){int i;if(s->top==MaxSize-1) //栈满的情况,即栈上溢出return 0;for(i=0;i<n;i++){s->top++; //栈顶指针增1s->data[s->top]=a[i]; //元素e放在栈顶指针处}return 1;}int Pop(SqStack*&s,ElemType &e)/*出栈一个元素*/ {if(s->top==-1) //栈为空的情况,即栈下溢出return 0;e=s->data[s->top]; //取栈顶元素s->top--; //栈顶指针减1return 1;}int GetTop(SqStack *s,ElemType &e)/*取栈顶元素*/{if(s->top==-1) //栈为空的情况,即栈下溢出return 0;e=s->data[s->top]; //取栈顶元素return 1;}int StackLength(SqStack *s)/*求栈长度*/{return(s->top+1);}void DispStack(SqStack *s){int i;for(i=s->top;i>=0;i--)printf("%c",s->data[i]);printf("\n");}void main(){int i,j;ElemType str[5]={'a','b','c','d','e'}; //定义字符数组SqStack *st; //定义栈InitStack(st);/*初始化*/i=StackEmpty(st); //判断栈是否为空if(i==0)printf("顺序栈非空\n");elseprintf("顺序栈为空\n");push(st,str,5); //进栈j=StackEmpty(st);if(j==0)printf("顺序栈非空\n");elseprintf("顺序栈为空\n");printf("栈长度为:%d\n",StackLength(st)); //输出栈长度printf("出栈序列:\n");DispStack(st); //输出栈StackEmpty(st);DestroyStack(st);}6.实验数据和实验结果:7.出现的问题及解决方案:(1)(2)(3)解决方案:(1)添加typedef char ElemType;(2)(3)三、程序盘提交的程序盘应包含全部的源程序清单和可执行文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一一个顺序栈的基本运算实验
一、实验目的:
对一个顺序栈的基本运算进行分析与设计,回顾数据结构所学过的知识,掌握一个顺序栈的基本运算实现,为下一步的实验奠定基础。
二、实验要求:
要求对一个顺序栈的基本运算作设计性实验,并上机运行,撰写实验报告。
三、实验内容:
一个顺序栈的数据类型表示和初始化、进栈、出栈基本运算。
四、实验环境:
Windows XP + VC++6.0开发环境。
五、实验步骤:
1、对顺序栈的知识进行复习,弄清楚栈的算法思想。
2、熟悉顺序栈的几种基本运算,即:
(1)初始化栈
int initStack(sqstack *s)
{/*创建一个空栈由指针S指出*/
if ((s=(sqstack*)malloc(sizeof(sqstack)))= =NULL) return FALSE;
s->top= -1;
return TRUE;
}
(2)入栈操作
int push(sqstack *s, Elemtype x)
{/*将元素x插入到栈s中,作为s的新栈顶*/
if(s->top>=MAXNUM-1) return FALSE; /*栈满*/
s->top++;
s->stack[s->top]=x;
return TRUE;
}
(3)出栈操作
Elemtype pop(sqstack *s)
{/*若栈s不为空,则删除栈顶元素*/
Elemtype x;
if(s->top<0) return NULL; /*栈空*/
x=s->stack[s->top];
s->top--;
return x;
}
(4)取栈顶元素操作
Elemtype gettop(sqstack *s)
{/*若栈s不为空,则返回栈顶元素*/
if(s->top<0) return NULL; /*栈空*/
return (s->stack[s->top]);
}
取栈顶元素与出栈不同之处在于出栈操作改变栈顶指针top的位置,而取栈顶元素操作不改变栈的栈顶指针.
(5)判栈空操作
int Empty(sqstack *s)
{/*栈s为空时,返回为TRUE;非空时,返回为FALSE*/
if(s->top<0) return TRUE;
return FALSE;
}
(6)置空操作
void setEmpty(sqstack *s)
{/*将栈s的栈顶指针top,置为-1*/
s->top= -1;
}
3、上机调试。
源代码如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 30
#define Elemtype int
/*定义顺序栈的存储结构*/
typedef struct
{
Elemtype stack[MAXNUM];
i nt top;
}SqStack;
/*初始化顺序栈*/
void InitStack(SqStack *p){
if(!p) printf("error");
p->top=-1;
}
/*入栈*/
void Push(SqStack *p,Elemtype x){
if(p->top<MAXNUM-1) p->stack[++p->top]=x;
e lse printf("Overflow!\n");
}
/*出栈*/
Elemtype Pop(SqStack *p){
Elemtype x;
if(p->top!=0){
x=p->stack[p->top];
p rintf("栈顶元素%d已经被删除!\n",p->stack[p->top]);
p->top--;
r eturn (x);
}
else{
p rintf("Underflow!\n");
r eturn(0);
}
}
/*获取栈顶元素*/
Elemtype GetTop(SqStack *p)
{ if(p->top!=0) return (p->stack[p->top]);
else { printf("Underflow!\n");
return(0); }
}
/*遍历顺序栈*/
void OutStack(SqStack *p)
{ int i;
printf("\n");
if(p->top<0) printf("这是一个空栈!\n");
for(i=p->top; i>=0; i--)
printf("第%d个数据是:%6d\n", i, p->stack[i]);
}
/*置空顺序栈*/
void setEmpty(SqStack *p)
{ p->top=-1;
}
/*主函数*/
main(){
{ SqStack *q;
int y, cord;
Elemtype a;
do { printf("\n第一次使用必须初始化!\n");
printf("\n");
printf("\n ****************** 主菜单************* \n"); printf("\n * 1 初始化顺序栈 * \n"); printf("\n * 2 插入一个元素 * \n"); printf("\n * 3 删除栈顶元素 * \n"); printf("\n * 4 取栈顶元素 * \n"); printf("\n * 5 置空顺序栈 * \n"); printf("\n * 6 结束程序运行 * \n"); printf("\n------------------------------------------\n"); printf("请输入您的选择( 1, 2, 3, 4, 5, 6): ");
scanf("%d", &cord);
printf("\n");
switch(cord)
{ case 1: { q=(SqStack*)malloc(sizeof(SqStack));
InitStack(q);
OutStack(q);
} break;
case 2: { printf("请输入要插入的数据元素:a=");
scanf("%d",&a);
Push(q, a);
OutStack(q);
} break;
case 3: { Pop(q);
OutStack(q);
} break;
case 4: { y=GetTop(q);
printf("\n栈顶元素为:%d\n", y); OutStack(q);
} break;
case 5: { setEmpty(q);
printf("\n 顺序栈被置空!\n");
OutStack(q);
} break;
case 6: exit(0);
}
} while (cord<=6);
}
}
六、实验测试结果及分析:
当第一场运行时需要初始化,即输入1,
进行初始化之后我们就可正常对顺序栈运算了,以此类推,我们将可以测试出以下其它结果:
我们插入了多个元素,然后进行读取栈顶元素及置空,这样更明显些,
七、总结:
通过本实验,对顺序栈的算法思想重新温习了一遍,有了更进一步的了解和掌握,从而也为编译原理下一个实验奠定了基础。