数据结构实验二_栈的基本操作
数据结构栈和队列实验报告
数据结构栈和队列实验报告实验报告:数据结构栈和队列一、实验目的1.了解栈和队列的基本概念和特点;2.掌握栈和队列的基本操作;3.掌握使用栈和队列解决实际问题的方法。
二、实验内容1.栈的基本操作实现;2.队列的基本操作实现;3.使用栈和队列解决实际问题。
三、实验原理1.栈的定义和特点:栈是一种具有后进先出(LIFO)特性的线性数据结构,不同于线性表,栈只能在表尾进行插入和删除操作,称为入栈和出栈操作。
2.队列的定义和特点:队列是一种具有先进先出(FIFO)特性的线性数据结构,不同于线性表,队列在表头删除元素,在表尾插入元素,称为出队和入队操作。
3.栈的基本操作:a.初始化:建立一个空栈;b.入栈:将元素插入栈的表尾;c.出栈:删除栈表尾的元素,并返回该元素;d.取栈顶元素:返回栈表尾的元素,不删除。
4.队列的基本操作:a.初始化:建立一个空队列;b.入队:将元素插入队列的表尾;c.出队:删除队列表头的元素,并返回该元素;d.取队头元素:返回队列表头的元素,不删除。
四、实验步骤1.栈的实现:a.使用数组定义栈,设置栈的大小和栈顶指针;b.实现栈的初始化、入栈、出栈和取栈顶元素等操作。
2.队列的实现:a.使用数组定义队列,设置队列的大小、队头和队尾指针;b.实现队列的初始化、入队、出队和取队头元素等操作。
3.使用栈解决实际问题:a.以括号匹配问题为例,判断一个表达式中的括号是否匹配;b.使用栈来实现括号匹配,遍历表达式中的每个字符,遇到左括号入栈,遇到右括号时将栈顶元素出栈,并判断左右括号是否匹配。
4.使用队列解决实际问题:a.以模拟银行排队问题为例,实现一个简单的银行排队系统;b.使用队列来模拟银行排队过程,顾客到达银行时入队,处理完业务后出队,每个顾客的业务处理时间可以随机确定。
五、实验结果与分析1.栈和队列的基本操作实现:a.栈和队列的初始化、入栈/队、出栈/队以及取栈顶/队头元素等操作均能正常运行;b.栈和队列的时间复杂度均为O(1),操作效率很高。
数据结构实验报告 栈进制转换
数据结构实验报告栈进制转换数据结构实验报告栈进制转换一、实验目的栈是一种常见的数据结构,本实验的目的在于通过实现栈的基本操作,设计并实现一个进制转换的程序,并通过实验验证程序的正确性和效率。
二、实验原理1.栈的定义和基本操作栈是一种后进先出(Last In First Out,简称LIFO)的数据结构。
它可以通过一个指针来标识当前栈顶元素,栈顶指针top的起始值为-1,空栈时top=-1.2.栈的进制转换将一个十进制数转换为其他进制(如二进制、八进制、十六进制)的过程中,可以通过栈来实现。
具体步骤如下:- 初始化一个空栈;- 将十进制数依次除以目标进制的基数,将余数依次入栈,直到商为0;- 依次出栈,将出栈的余数组合起来,得到转换后的目标进制数。
三、实验内容1.实现栈的基本操作(1)定义栈结构,包括元素数组和栈顶指针;(2)实现入栈操作push(),将元素插入到栈顶;(3)实现出栈操作pop(),从栈顶删除一个元素并返回其值;(4)实现获取栈顶元素的操作getTop(),返回栈顶元素的值;(5)实现判断栈是否为空的操作isEmpty(),返回布尔值;(6)实现判断栈是否已满的操作isFull(),返回布尔值。
2.设计并实现进制转换的程序(1)初始化一个空栈用于存放转换后的数字;(2)输入十进制数num和目标进制target;(3)通过栈的操作将num转换为target进制数;(4)输出转换后的结果。
四、实验步骤1.实现栈的基本操作(1)定义栈的结构和相关操作;(2)编写相应的测试代码,验证栈的基本操作是否正确。
2.设计并实现进制转换的程序(1)根据原理部分的步骤,设计转换程序的具体逻辑;(2)编写相应的测试代码,验证转换程序的正确性和效率。
五、实验结果与分析1.给定一个十进制数num=12345,目标进制为二进制(target=2),经过进制转换后得到的结果为.111.2.给定一个十进制数num=456,目标进制为八进制(target=8),经过进制转换后得到的结果为.710.本实验的结果表明,转换程序能够正确地将十进制数转换为目标进制数,并且具有较高的效率。
栈基本操作
栈基本操作栈是一种常见的数据结构,它遵循“先进后出”的原则。
在栈中,数据项只能在栈顶进行插入和删除操作,因此栈的基本操作包括:入栈、出栈、取栈顶元素、判断栈是否为空和清空栈。
一、入栈操作入栈操作是向栈中添加元素的过程。
在入栈操作中,新元素被添加到栈顶位置。
具体实现方法是将新元素压入栈顶,在栈顶添加一个新节点,使其指向旧的栈顶节点。
二、出栈操作出栈操作是从栈中移除元素的过程。
在出栈操作中,栈顶元素被删除,并返回被删除的元素。
具体实现方法是将栈顶元素弹出,使其指向下一个元素,然后返回弹出的元素。
三、取栈顶元素取栈顶元素操作是返回栈顶元素的值,而不删除该元素。
具体实现方法是返回栈顶指针所指向的元素。
四、判断栈是否为空判断栈是否为空操作是检查栈中是否有元素。
具体实现方法是检查栈顶指针是否为NULL。
如果栈顶指针为NULL,则表示栈为空;否则,栈中至少有一个元素。
五、清空栈清空栈操作是将栈中所有元素都删除。
具体实现方法是将栈顶指针设置为NULL,使所有元素都失去了指向下一个元素的指针。
以上就是栈的基本操作。
在实际应用中,栈是一种非常重要的数据结构,常用于递归算法、表达式求值、括号匹配、迷宫问题等领域。
除了上述基本操作外,还有一些较为复杂的栈操作,例如:栈的遍历、栈的排序、栈的合并等等。
在实际应用中,我们需要根据具体的需求选择合适的操作。
需要注意的是,栈是一种线性数据结构,因此它的时间复杂度为O(1),即入栈、出栈、取栈顶元素、判断栈是否为空、清空栈等操作的时间复杂度都为O(1)。
这也是栈被广泛应用的重要原因之一。
栈的基本操作
栈的基本操作栈是一种重要的数据结构,它在计算机科学中有着广泛的应用。
对于栈的基本操作,包括入栈(push)、出栈(pop)、获取栈顶元素,以及查看栈的大小(size)等操作。
1.入栈(push)入栈的操作就是往栈里压栈,把元素压入栈顶,以实现入栈操作。
在把元素压入栈时,栈的元素数量会增加1,压入元素的位置就是栈顶。
2.出栈(pop)出栈的操作是从栈顶弹出元素,以实现出栈操作。
当一个元素从栈顶弹出时,栈的大小就会减少1,弹出元素的位置就是栈顶。
3.获取栈顶元素要获取栈顶元素,我们需要从栈中取出元素,但是这并不会改变栈的大小。
由于栈的特性,我们可以通过取出栈顶的元素来获取它,而不需要从栈的其他位置获取。
4.查看栈的大小(size)查看栈的大小也就是查看栈中有多少元素。
要查看栈的大小,我们只要通过查看栈的长度即可,从而知道栈中有多少元素,从而了解栈的大小。
到此,我们对栈的基本操作基本有了一个概念,包括入栈(push)、出栈(pop)、获取栈顶元素以及查看栈的大小(size)。
栈的操作可以用入栈出栈的方式来表示,也可以用推入和弹出的方式来表示,它们都是栈的基本操作。
栈的操作跟其他的数据结构的操作有所不同,比如要存储数据的时候,需要先进行入栈操作,而当要取出数据的时候,需要先进行出栈操作,而不是像队列里面先进行出队操作,再进行入队操作。
栈也可以用来实现字符串操作、算数表达式求值、函数调用以及实现括号的匹配等等,这些都是栈的基本操作的应用。
总而言之,栈是一种重要的数据结构,其基本操作可以说是它的核心。
因此,学习栈的基本操作非常重要,只有掌握了它的基本操作,才可以正确的使用栈这种数据结构。
数据结构实验报告2栈、队列、递归程序设计
日期:学号:姓名:
实验名称:实验报告二栈、队列、递归程序设计
实验目的与要求:
2.1栈和队列的基本操作
(1)正确理解栈的先进后出的操作特点,建立初始栈,通过相关操作显示栈底元素。
(2)程序中要体现出建栈过程和取出栈底元素后恢复栈的入栈过程,按堆栈的操作规则打印结果栈中的元素
{
return(s->top==-1);
}
//---出栈函数
int Pop(SeqStack *&s,ElemType &e)
{
if (s->top==-1)
return 0;
e=s->data[s->top];
s->top--;
return 1;
}
//---初始队列函数
void InitQueue(SqQueue *&q)
q->rear=(q->rear+1)%MaxSize;
q->elem[q->rear]=e;
return 1;
}
//---出队列函数
int OutQueue(SqQueue *&q,ElemType &e)
{
if (q->front==q->rear) //队空
return 0;
q->front=(q->front+1)%MaxSize;
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(q)?"空":"非空"));
数据结构实验二_栈的基本操作
青岛理工大学课程实验报告及实验步骤只要X不为0重复做下列动作将X%R入栈X=X/R只要栈不为空重复做下列动作栈顶出栈输出栈顶元素调试过程及实验结果根据输入的十进制数通过桟的基本操作可以转换成二进制、八进制、十六进制的数。
在上机过程中程序的调用没有太大的问题,按照课本的基本算法就可以将程序正确的运行。
总结程序可以完成基本的功能,可以将十进制数转换为其他进制的数,基本掌握了桟的几种常用的操作;但程序存在缺陷,就是不能持续进行操作,输入了一个十进制数只能进行一次数制转换,程序就会退出,有待改进。
附录#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define stack_init_size 100#define stackincrement 10typedef struct sqstack{int *base;int *top;int stacksize;} sqstack;int StackInit(sqstack *s){s->base=(int *)malloc(stack_init_size *sizeof(int));if(!s->base)return 0;{return 0;}}int conversion(sqstack *s){int n,e=0,flag=0;printf("输入要转化的十进制数:\n");scanf("%d",&n);printf("要转化为多少进制:2进制、8进制、16进制填数字!\n");scanf("%d",&flag);printf("将十进制数%d转化为%d进制是:\n",n,flag);while(n){s->top=s->base;s->stacksize=stack_init_size;return 1;}int Push(sqstack *s,int e){if(s->top-s->base>=s->stacksize){s->base=(int*)realloc(s->base,(s->stacksize+stackincrement)*sizeof(int)); if(!s->base)return 0;s->top=s->base+s->stacksize;s->stacksize+=stackincrement;}*(s->top++)=e;return e;}int Pop(sqstack *s,int e){if(s->top==s->base)return 0;e=*--s->top;return e;}int stackempty(sqstack *s){if(s->top==s->base){return 1;}elsePush(s,n%flag);n=n/flag;}while(!stackempty(s)) {e=Pop(s,e);switch(e){case 10: printf("A");break;case 11: printf("B");break;case 12: printf("C");break;case 13: printf("D");break;case 14: printf("E");break;case 15: printf("F");break;default: printf("%d",e); }}printf("\n");return 0;}int main(){sqstack s;StackInit(&s); conversion(&s);return 0;}。
栈的基本操作代码
栈的基本操作代码引言栈(Stack)是一种常见的数据结构,具有后进先出(Last In First Out,LIFO)的特性。
栈的基本操作包括入栈(Push)、出栈(Pop)、获取栈顶元素(Top)和判断栈是否为空(IsEmpty)。
本文将详细介绍栈的基本操作代码及其实现。
一、栈的定义栈是一种线性数据结构,仅允许在一端进行插入和删除操作。
这一端被称为栈顶,另一端称为栈底。
栈的插入操作叫做入栈,删除操作叫做出栈。
栈的特性决定了最后插入的元素最先删除。
二、栈的基本操作2.1 入栈(Push)入栈操作将一个元素添加到栈的栈顶。
具体实现如下:class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)2.2 出栈(Pop)出栈操作将栈顶元素删除并返回。
具体实现如下:class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if not self.is_empty():return self.stack.pop()else:return None2.3 获取栈顶元素(Top)获取栈顶元素操作不改变栈的结构,仅返回栈顶元素的值。
具体实现如下:class Stack:def __init__(self):self.stack = []def push(self, item):self.stack.append(item)def pop(self):if not self.is_empty():return self.stack.pop()else:return Nonedef top(self):if not self.is_empty():return self.stack[-1]else:return None2.4 判断栈是否为空(IsEmpty)判断栈是否为空操作用于检测栈内是否还有元素。
栈的操作(实验报告)
引言:栈是一种常见的数据结构,它具有特殊的操作规则,即先进后出(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.撤销操作使用栈来实现撤销操作的原理和过程在编辑器、图形处理软件等领域的实际应用总结:本文详细介绍了栈的操作,包括基本操作(压栈、弹栈、获取栈顶元素、判断栈是否为空、栈的大小)和应用场景(括号匹配、浏览器的后退和前进功能、函数调用和递归、实现浏览器缓存、撤销操作)。
通过了解栈的操作和应用,我们可以更好地理解数据结构中的栈,并能够在实际问题中灵活运用栈的特性。
数据结构栈的基本操作
数据结构栈的基本操作栈是一种数据结构,它具有后进先出(LIFO)的特性。
栈可以用数组或链表实现,其基本操作包括入栈、出栈、查看栈顶元素和判断栈是否为空。
1. 入栈操作入栈操作是将元素添加到栈顶的过程。
在数组实现中,我们需要维护一个指针top,指向当前的栈顶元素。
当我们要入栈一个新元素时,我们将top加1,并将该元素放在新的top位置上。
在链表实现中,我们只需要在链表头部插入新节点即可。
以下是使用数组实现入栈操作的示例代码:```#define MAX_SIZE 100int stack[MAX_SIZE];int top = -1;void push(int x) {if (top == MAX_SIZE - 1) {printf("Stack overflow\n");return;}top++;stack[top] = x;}```2. 出栈操作出栈操作是将当前的栈顶元素删除并返回其值的过程。
在数组实现中,我们只需要将top减1即可。
在链表实现中,我们需要删除链表头部节点并返回其值。
以下是使用数组实现出栈操作的示例代码:```int pop() {if (top == -1) {printf("Stack underflow\n");return -1;}int val = stack[top];top--;return val;}```3. 查看栈顶元素查看栈顶元素是获取当前的栈顶元素的值,而不删除它的过程。
在数组实现中,我们只需要返回stack[top]即可。
在链表实现中,我们需要返回链表头部节点的值。
以下是使用数组实现查看栈顶元素操作的示例代码:```int peek() {if (top == -1) {printf("Stack is empty\n");return -1;}return stack[top];}```4. 判断栈是否为空判断栈是否为空是检查当前栈是否包含任何元素的过程。
北邮数据结构实验报告二_栈和队列
2009级数据结构实验报告实验名称:实验二栈和队列学生姓名:班级:班内序号:学号:日期:2010年12月18日实验要求题目四用栈做计算器。
设计一个算术四则运算表达式求值的简单计算器。
表达式求值是程序设计语言编译中最近本的问题,它要求把一个表达式翻译成能够直接求值的序列。
基本要求:输入中缀表达式能够转化成后缀表达式,比如输入中缀表达式“(A+B)*C”,输出“AB+C*”2、操作数使用单字母变量A、B、C等表示,操作符仅为+、-、*、/、(和);3、能够对变量A、B、C等赋值,得出正确的计算结果2. 程序分析首先,程序要求用户输入一个符号表达式,只能包含字母、+、-、*、/ 以及)和(,之后程序会用一个TurnInfixToPostfix()函数将表达式转化成后缀表达式存入一个栈中,转化过程借用逆波兰算法,建立一个符号栈,遍历用户输入的表达式,如果是字母,则直接输出,如果是运算符,则压入符号栈中(包括括号),在压栈的时候又需要注意,先要检查压栈前栈顶元素的优先级,如果优先级高于要压入的符号则直接压入该符号,否则要弹栈直到栈顶元素的优先级小于该元素的优先级然后才将该符号压入栈中(在压栈的时候会涉及到栈中有括号的情况,具体细节下面会说到),将转化的后缀表达式存入栈postfix,在输出的时候只要弹栈就行。
然后,要求用户逐个输入表达式中的字母的值,这时候,需要遍历当时在转化后缀表达式的时候过度容器vec_intoposfix,如果是字母则要求用户输入数值,压入用于计算的后缀表达式容器,如果是操作符则直接压入。
最后,在利用栈来计算值的时候,利用一个递归函数,就是一次弹栈,如果是操作符则先保存起来,接着继续弹栈,如果接下来的两个元素都为数字,就将这两个数字做相应的运算,然后压栈,如此反复,最后压入栈的元素就是表达式的值。
至此,程序的功能全部实现。
2.1 存储结构[内容要求]1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59页图2-92.2 关键算法分析关键算法一:将中缀表达式转化为后缀表达式VoidTurnInfixToPostfix(vector<char>&vec,stack<char>&sta,vector<char>&vecfix,stack< char>&stafix)1、 {2、int priority(-1);3、4、for (vector<char>::iterator itr=vec.begin();itr!=vec.end();itr++)5、{6、if(isLetter(*itr))7、{8、vecfix.push_back(*itr);9、}10、if (isOperator(*itr))11、{12、if(!sta.empty()) priority=getPriority(sta.top());13、else priority=-1;14、if (priority<getPriority(*itr)||priority==3&&sta.top()!=')')15、{16、sta.push(*itr);17、}18、else19、{20、if (sta.top()!=')')21、{22、while(priority>=getPriority(*itr)&&sta.top()!='(')23、{24、vecfix.push_back(sta.top());25、if (!sta.empty())26、{27、sta.pop();28、if(!sta.empty()) priority=getPriority(sta.top());29、else priority=-1;30、}31、else32、break;33、}34、sta.push(*itr);35、}36、else if(sta.top()==')')37、{38、while (sta.top()!='(')39、{40、vecfix.push_back(sta.top());41、if (!sta.empty()&&sta.top()!='(')42、{43、sta.pop();44、}45、else46、break;47、}48、}49、}50、51、52、}53、54、}55、for (vector<char>::iteratoritrfix=vecfix.end();itrfix!=vecfix.begin();--itrfix)56、stafix.push(*itrfix);57、stafix.push(*itrfix);58、}对表达式a + b * c – ( d – e) / f + g其符号栈的变化过程,红色表示未压栈的符号。
栈的应用实验报告
栈的应用实验报告栈的应用实验报告引言:栈是一种常见的数据结构,它具有后进先出(Last In First Out,LIFO)的特点。
在计算机科学中,栈被广泛应用于各种领域,如编译器、操作系统、图形处理等。
本实验旨在通过实际应用场景,探索栈的应用。
一、栈的基本概念和操作栈是一种线性数据结构,它由一系列元素组成,每个元素都有一个前驱元素和一个后继元素。
栈的基本操作包括入栈(Push)和出栈(Pop)。
入栈将元素添加到栈的顶部,而出栈则将栈顶元素移除。
此外,栈还具有查看栈顶元素(Top)和判断栈是否为空(IsEmpty)的操作。
二、栈在表达式求值中的应用栈在表达式求值中发挥着重要作用。
例如,当我们需要计算一个数学表达式时,可以通过将表达式转换为后缀表达式,并利用栈来进行求值。
栈中存储操作数,当遇到运算符时,从栈中弹出相应数量的操作数进行计算,再将结果入栈。
通过这种方式,我们可以实现高效的表达式求值。
三、栈在函数调用中的应用栈在函数调用中也扮演着重要角色。
当我们调用一个函数时,计算机会将函数的返回地址、参数和局部变量等信息存储在栈中。
这样,当函数执行完毕后,可以从栈中恢复之前的上下文,继续执行调用函数的代码。
栈的这种特性使得递归函数的实现成为可能,同时也为程序的模块化提供了便利。
四、栈在迷宫求解中的应用栈在迷宫求解中也能发挥重要作用。
当我们需要找到从起点到终点的路径时,可以利用栈来存储当前路径上的位置。
从起点开始,我们按照某种策略选择下一个位置,并将其入栈。
如果当前位置无法继续前进,则将其出栈,并选择下一个位置。
通过不断重复这个过程,直到找到终点或者栈为空,我们就能得到迷宫的解。
五、栈在撤销和恢复操作中的应用栈在撤销和恢复操作中也能发挥重要作用。
当我们在编辑文档或者绘图时,经常需要进行撤销和恢复操作。
栈可以用来记录每次操作的状态,当用户选择撤销时,从栈中弹出最近的操作,并将文档或图形恢复到之前的状态。
通过这种方式,我们可以提供良好的用户体验,同时也方便用户进行操作的回溯。
栈和队列的应用实验报告
栈和队列的应用实验报告
《栈和队列的应用实验报告》
一、实验目的
本实验旨在通过实际操作,掌握栈和队列的基本概念、操作及应用,加深对数
据结构的理解和应用能力。
二、实验内容
1. 栈的基本操作:包括入栈、出栈、获取栈顶元素等。
2. 队列的基本操作:包括入队、出队、获取队首元素等。
3. 栈和队列的应用:通过实际案例,探讨栈和队列在实际生活中的应用场景。
三、实验步骤
1. 学习栈和队列的基本概念和操作。
2. 编写栈和队列的基本操作代码,并进行调试验证。
3. 分析并实现栈和队列在实际应用中的案例,如表达式求值、迷宫问题等。
4. 进行实际应用案例的测试和验证。
四、实验结果
1. 成功实现了栈和队列的基本操作,并通过实际案例验证了其正确性和可靠性。
2. 通过栈和队列在实际应用中的案例,加深了对数据结构的理解和应用能力。
五、实验总结
通过本次实验,我深刻理解了栈和队列的基本概念和操作,并掌握了它们在实
际应用中的重要性和作用。
栈和队列作为数据结构中的重要内容,对于解决实
际问题具有重要意义,希望通过不断的实践和学习,能够更加熟练地运用栈和
队列解决实际问题,提高自己的编程能力和应用能力。
六、感想与展望
本次实验让我对栈和队列有了更深入的了解,也让我对数据结构有了更加深刻的认识。
我将继续学习和探索更多的数据结构知识,提高自己的编程能力和解决问题的能力,为将来的学习和工作打下坚实的基础。
同时,我也希望能够将所学知识应用到实际工程中,为社会做出更大的贡献。
武汉理工数据结构实验2 栈和队列基本操作和应用
实验2 栈和队列的基本操作和应用1实验目的(1)熟练掌握顺序栈的基本操作。
(2)掌握顺序栈的应用。
(3)掌握顺序循环队列的基本操作。
(4)掌握链式队列的基本操作。
2实验内容(1)设计一个顺序栈的基本操作的演示程序;(2)利用顺序栈,进行整数的不同进制之间的转换;(3)设计一个顺序循环队列的基本操作演示程序;(4)设计一个链式队列的基本操作演示程序。
【基本要求】I.实验内容(1)的基本要求:编写一个程序,将一个顺序栈的元素依次取出,并打印其元素值。
II.实验内容(2)的基本要求:编写一个程序,将一个非负的十进制整数转换成二进制。
III.实验内容(3)的基本要求:编写一个程序,将一个顺序队列的元素依次取出,并打印其元素值。
IV.实验内容(4)的基本要求:编写一个程序,将一个链式队列的元素依次取出,并打印其元素值。
【测试数据】自定3实验结果按照学校实验格式要求撰写实验报告,内容主要包括1)实验目的;2)实验内容;3)实验环境和方法;4)实验过程描述;5)实验心得体会参考程序如下:实验内容(1)参考程序/*sqStack.h文件*/#define INIT_SIZE 100#define INCREMENT 10typedef int ElemType;//typedef char ElemType;typedef struct SqStack {ElemType *base;ElemType *top;int stacksize;}SqStack;enum Status{OK,ERROR,OVERFLOW};/*sqStackOp.h文件*/#include "sqStack.h"Status InitStack(SqStack &S) ;Status GetTop(SqStack S,ElemType &e);Status Push(SqStack &S,ElemType e);Status Pop(SqStack &S,ElemType &e);bool StackEmpty(SqStack &S);/*sqStackOp.cpp文件*/#include <malloc.h>#include <stdlib.h>#include "sqStackOp.h"Status InitStack(SqStack &S) {//构造一个空的栈S.base=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(! S.base) exit(OVERFLOW); //存储分配失败S.top=S.base;S.stacksize=INIT_SIZE;return OK;} //InitStackStatus GetTop(SqStack S,ElemType &e){//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR if(S.top==S.base) return ERROR;e=*(S.top-1);return OK;} //GetTopStatus Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){ //栈满,追加存储空间S.base=(ElemType *)realloc(S.base,(S.stacksize+INCREMENT)*sizeof(ElemType));if(!S.base)exit(OVERFLOW); //存储分配失败S.top=S.base+S.stacksize;S.stacksize+=INCREMENT;}*S.top++=e;return OK;} //PushStatus Pop(SqStack &S,ElemType &e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base) return ERROR;e=*(--S.top);return OK;} //Push//判断栈是否为空bool StackEmpty(SqStack &S){if(S.top == S.base)return true;elsereturn false;}/*main.cpp文件*/#include <stdio.h>#include <stdlib.h>#include "sqStackOp.h"void main(){printf("Hellow stack \n");SqStack S; //定义顺序栈Sif(OK != InitStack(S)) {printf("顺序栈初始化出错,退出....\n");exit(-1);}Push(S, 1);Push(S,2);Push(S,3);int e;Pop(S, e);printf("出栈元素= %d \n",e);Push(S,4);Push(S,5);while(!StackEmpty(S)){Pop(S, e);printf("出栈元素= %d \n",e);}/*SqStack S; char x,y;InitStack(S); x='c';y='k';Push(S,x); Push(S,'a'); Push(S,y);Pop(S,x); Push(S,'t'); Push(S,x);Pop(S,x); Push(S,'s');while(!StackEmpty(S)){ Pop(S,y);printf("%c ",y); };printf("%c ",x);*/getchar();}实验内容(2)参考程序/*sqStack.h文件*/#define INIT_SIZE 100#define INCREMENT 10typedef int ElemType;typedef struct SqStack {ElemType *base;ElemType *top;int stacksize;}SqStack;enum Status{OK,ERROR,OVERFLOW};/*sqStackOp.h文件*/#include "sqStack.h"Status InitStack(SqStack &S) ;Status GetTop(SqStack S,ElemType &e);Status Push(SqStack &S,ElemType e);Status Pop(SqStack &S,ElemType &e);bool StackEmpty(SqStack &S);/*sqStackOp.cpp文件*/#include <malloc.h>#include <stdlib.h>#include "sqStackOp.h"Status InitStack(SqStack &S) {//构造一个空的栈S.base=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));if(! S.base) exit(OVERFLOW); //存储分配失败S.top=S.base;S.stacksize=INIT_SIZE;return OK;} //InitStackStatus GetTop(SqStack S,ElemType &e){//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORif(S.top==S.base) return ERROR;e=*(S.top-1);return OK;} //GetTopStatus Push(SqStack &S,ElemType e){//插入元素e为新的栈顶元素if(S.top-S.base>=S.stacksize){ //栈满,追加存储空间S.base=(ElemType *)realloc(S.base,(S.stacksize+INCREMENT)*sizeof(ElemType));if(!S.base)exit(OVERFLOW); //存储分配失败S.top=S.base+S.stacksize;S.stacksize+=INCREMENT;}*S.top++=e;return OK;} //PushStatus Pop(SqStack &S,ElemType &e){//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORif(S.top==S.base) return ERROR;e=*(--S.top);return OK;} //Push//判断栈是否为空bool StackEmpty(SqStack &S){if(S.top == S.base)return true;elsereturn false;}/*main.cpp文件*/#include <stdio.h>#include <stdlib.h>#include "sqStackOp.h"void main(){SqStack s;int x;InitStack(s);scanf("%d",&x); //%d--十进制输入;%O--八进制输入;%x--十六进制输入//修改这里输入进制和下面整除和余数计算,就可以获得其他进制的转换while(x!=0){Push(s,x%8);x=x/8;}while(!StackEmpty(s)){Pop(s,x);printf("%d ",x);}printf("\n");getchar();}实验内容(3)参考程序/*sqQueue.h 文件*/#define MAXQSIZE 100typedef int QElemType;typedef struct SqQueue {QElemType *base;int front;int rear;}SqQueue;enum Status{OK,ERROR,OVERFLOW};/*sqQueueOp.h 文件*/#include "sqQueue.h"Status InitQueue (SqQueue &Q) ;Status EnQueue (SqQueue &Q, QElemType e);Status DeQueue (SqQueue &Q, QElemType &e) ;bool QueueEmpty(SqQueue &Q);int QueueLength(SqQueue Q);/*sqQueueOp.cpp 文件*/#include <malloc.h>#include <stdlib.h>#include "sqQueueOp.h"Status InitQueue (SqQueue &Q) {// 构造一个空队列QQ.base = (QElemType *) malloc(MAXQSIZE *sizeof (QElemType));if (!Q.base) exit (OVERFLOW);// 存储分配失败Q.front = Q.rear = 0;return OK;}Status EnQueue (SqQueue &Q, QElemType e) { // 插入元素e为Q的新的队尾元素if ((Q.rear+1) % MAXQSIZE == Q.front)return ERROR; //队列满Q.base[Q.rear] = e;Q.rear = (Q.rear+1) % MAXQSIZE;return OK;}Status DeQueue (SqQueue &Q, QElemType &e) { // 若队列不空,则删除Q的队头元素,// 用e返回其值,并返回OK; 否则返回ERRORif (Q.front == Q.rear) return ERROR;e = Q.base[Q.front];Q.front = (Q.front+1) % MAXQSIZE;return OK;}//判断队列是否为空bool QueueEmpty(SqQueue &Q){if(Q.front== Q.rear)return true;elsereturn false;}//计算循环队列长度int QueueLength(SqQueue Q){return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE;}/*main.cpp 文件*/#include <stdio.h>#include <stdlib.h>#include "sqQueueOp.h"void main(){printf("Hello Queue \n");SqQueue Q; //定义顺序队列QQElemType e;if(OK != InitQueue(Q)) {printf("顺序队列初始化出错,退出....\n");exit(-1);}EnQueue(Q,1);EnQueue(Q,3);EnQueue(Q,5);EnQueue(Q,7);printf("当前队列长度= %d \n",QueueLength(Q));DeQueue(Q,e);printf("队首元素%d出队,当前队列长度=%d\n",e,QueueLength(Q));EnQueue(Q,9);EnQueue(Q,11);while(!QueueEmpty(Q)){DeQueue(Q,e);printf("队首元素%d出队,当前队列长度=%d\n",e,QueueLength(Q));}getchar();}实验内容(4)参考程序/*linkQueue.h 文件*/typedef int QElemType;typedef struct QNode {// 结点类型QElemType data;struct QNode *next;} QNode, *QueuePtr;typedef struct { // 链队列类型QueuePtr front; // 队头指针QueuePtr rear; // 队尾指针} LinkQueue;enum Status{OK,ERROR,OVERFLOW};/*linkQueueOp.h 文件*/#include "linkQueue.h"Status InitQueue (LinkQueue &Q) ;Status EnQueue (LinkQueue &Q, QElemType e); Status DeQueue (LinkQueue &Q, QElemType &e) ; bool QueueEmpty(LinkQueue &Q);/*linkQueueOp.cpp 文件*/#include <malloc.h>#include <stdlib.h>#include "linkQueueOp.h"Status InitQueue (LinkQueue &Q) {// 构造一个空队列QQ.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));if (!Q.front) exit (OVERFLOW);//存储分配失败Q.front->next = NULL;return OK;}Status EnQueue (LinkQueue &Q, QElemType e) { // 插入元素e为Q的新的队尾元素QueuePtr p = (QueuePtr) malloc (sizeof (QNode));if (!p) exit (OVERFLOW); //存储分配失败p->data = e;p->next = NULL;Q.rear->next = p;Q.rear = p;return OK;}Status DeQueue (LinkQueue &Q, QElemType &e) { // 若队列不空,则删除Q的队头元素,//用e 返回其值,并返回OK;否则返回ERROR if (Q.front == Q.rear) return ERROR;QueuePtr p = Q.front->next;e = p->data;Q.front->next = p->next;if (Q.rear == p) Q.rear = Q.front;free (p);return OK;}//判断队列是否为空bool QueueEmpty(LinkQueue &Q){if(Q.front == Q.rear)return true;elsereturn false;}/*main.cpp 文件*/#include <stdio.h>#include <stdlib.h>#include "linkQueueOp.h"void main(){printf("Hello LinkQueue \n");LinkQueue Q; //定义顺序队列QQElemType e;if(OK != InitQueue(Q)) {printf("顺序队列初始化出错,退出....\n");exit(-1);}EnQueue(Q,1);EnQueue(Q,3);EnQueue(Q,5);EnQueue(Q,7);DeQueue(Q,e);printf("队首元素%d出队,\n",e);EnQueue(Q,9);EnQueue(Q,11);while(!QueueEmpty(Q)){DeQueue(Q,e);printf("队首元素%d出队,\n",e);}getchar();}。
《数据结构》实验书
目录实验一线性表基本操作的编程实现 (201)实验二堆栈或队列基本操作的编程实现 (49)实验四二维数组基本操作的编程实现 (18)实验五二叉树基操作的编程实现 (20)实验六图基本操作的编程实现 (45)(特别提示:程序设计包含两个方面的错误。
其一是错误,其二是能错误。
为了提高学生的编程和能力,本指导书给出的程序代码并的两种错误。
并且也不保证程序的完整性,有一些语句已经故意删除,就是要求学生自己编制完成,这样才能达到我们的要求。
希望大家以自己所学高级语言的基本功和点为基础,不要过于依赖给出的参考代码,这样才能有所进步。
如果学生能够根据要求完全自己编制,那就不好了。
)实验一线性表基本操作的编程实现【实验目的】线性表基本操作的编程实现要求:线性表基本操作的编程实现(2学时,验证型),掌握线性表的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找、逆序、排序等操作,存储结构可以在顺序结构或链表结分主要功能,也可以用菜单进行管理完成大部分功能。
还鼓励学生利用基本操作进行一些更实际的应用型程序设计。
【实验性质】【实验内容】把线性表的顺序存储和链表存储的数据插入、删除运算其中某项进行程序实现。
建议实现键盘输入数据以实现程序的通据的函数。
【注意事项】【思考问题】1.线性表的顺序存储和链表存储的差异?优缺点分析?2.那些操作引发了数据的移动?3.算法的时间效率是如何体现的?4.链表的指针是如何后移的?如何加强程序的健壮性?【参考代码】(一)利用顺序表完成一个班级学生课程成绩的简单管理1、预定义以及顺序表结构类型的定义(1)#define ListSize //根据需要自己设定一个班级能够容纳的最大学生数(2)typedef struct Stu{int num; //学生的学号char name[10]; //学生的姓名float wuli; //物理成绩float shuxue; //数学成绩float yingyu; //英语成绩}STUDENT; //存放单个学生信息的结构体类型typedef struct List{stu[ListSize]; //存放学生的数组定义,静态分配空间int length; //记录班级实际学生个数}LIST; //存放班级学生信息的顺序表类型2、建立班级的学生信息void listcreate(LIST *Li,int m) //m为该班级的实际人数{int i;Li->length=0;for(i=0;i<m;i++) //输入m个学生的所有信息{printf("please input the %dth student's information:\n",i+1);printf("num=");scanf("%d", ); //输入第i个学生的学号printf("name=");scanf("%s", ); //输入第i个学生的姓名printf("wuli=");scanf("%f", ); //输入第i个学生的物理成绩printf("shuxue=");scanf("%f", ); //输入第i个学生的数学成绩printf("yingyu=");scanf("%f", ); //输入第i个学生的英语成绩Li->length++; //学生人数加1}}3、插入一个学生信息int listinsert(LIST *Li,int i) //将学生插入到班级Li的第i个位置。
数据结构实验报告(二)栈的应用
数据结构实验报告(⼆)栈的应⽤实验说明数据结构实验⼆ 栈的实验——栈的简单应⽤⼀、实验⽬的通过本实验使学⽣了解栈的简单应⽤,熟悉栈的特性及栈在顺序存储上的操作特点,深刻理解栈的基本操作与⽤栈解决应⽤问题的关系;特别训练学⽣使⽤栈解决实际问题的能⼒,为今后⽤栈解决相关问题奠定基础。
⼆、实验内容1.编程实现对给定的⼀组括号序列判断其是否匹配正确。
要求:(1)它必须成对出现,如“(”“)”是⼀对,“[”与“]”是⼀对;(2)出现时有严格的左右关系;(3)可以以嵌套的⽅式同时出现多组多括号,但必须是包含式嵌套,不允许交叉式嵌套。
⽐如“( )”、“[([][])]”这样是正确的,“[(])”或“([()))”或 “(()]”是不正确的。
(4)将处理的括号扩展为针对“()”“[]”“{}”三类。
2.编程实现⼀个简单的⾏编辑功能:⽤户可以输⼊⼀⾏内容,并可进⾏简易编辑。
要求:(1)遇到输⼊部分内容有误时操作退格符“#”表⽰前⼀位⽆效;(2)“@”表⽰之前的内容均⽆效。
实验报告1.实现功能描述编程实现对给定的⼀组括号序列判断其是否匹配正确,将处理的括号扩展为针对“()”“[]”“{}”三类,遇到输⼊部分内容有误时操作退格符“#”表⽰前⼀位⽆效;“@”表⽰之前的内容均⽆效。
2.⽅案⽐较与选择(1)可以使⽤栈和队列来实现。
因为栈的功能⾜以完成题⽬要求,所以初步打算使⽤栈来实现。
(2)因为编写⼀个标准的栈⽐较繁琐,⽽且本题中也没有⽤到所有栈的标准操作,所以通过模拟栈来完成本题。
(3)可以使⽤数组或链表来模拟栈。
因为括号匹配只有3对,所需空间不是很⼤,⼜因为特殊操作#、@可以在数组中通过-1和赋0值实现,因此选择了数组法来模拟栈。
3.设计算法描述(1)定义3个变量,分别⽤于记录()、[]、{}的出现次数。
遇到左符号时变量++,遇到右符号时--,变量为0时表⽰空栈。
当读到#时,再往前读⼀个字符,如果是()、[]、{}中的⼀种,则对其进⾏反向运算,即遇到右符号时++,遇到左符号时--。
pta7-1数据结构栈的基本操作
pta7-1数据结构栈的基本操作下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!数据结构栈的基本操作数据结构中的栈(Stack)是一种常见且重要的数据结构,它遵循先进后出(LIFO)的原则,类似于我们日常生活中的栈书本的方式。
关于栈的实验报告
关于栈的实验报告引言栈(Stack)是一种常用的数据结构,它基于后进先出(Last In First Out,LIFO)的原则,元素的插入和删除操作只能在栈顶进行。
栈具有快速插入和删除元素的特点,因此在很多应用中广泛使用。
本实验旨在通过编写一个栈的实现,探究栈的基本操作以及应用,并对栈的性能进行评估。
一、栈的实现1. 栈的定义使用数组来实现一个基本的栈结构,可以定义一个栈类`Stack`,其中包含以下属性和方法:- 属性:- `max_size`:栈的最大容量- `top`:栈顶指针- `data`:存储栈元素的数组- 方法:- `__init__(self, size)`:构造函数,初始化栈对象,参数为栈的最大容量- `is_empty(self)`:判断栈是否为空- `is_full(self)`:判断栈是否已满- `push(self, item)`:将元素压入栈顶- `pop(self)`:从栈顶弹出一个元素- `peek(self)`:返回栈顶元素- `size(self)`:返回栈的当前大小- `clear(self)`:清空栈中所有元素2. 栈的实现pythonclass Stack:def __init__(self, size):self.max_size = sizeself.top = -1self.data = [None] * sizedef is_empty(self):return self.top == -1def is_full(self):return self.top == self.max_size - 1 def push(self, item):if self.is_full():print("Stack is full.")returnself.top += 1self.data[self.top] = itemdef pop(self):if self.is_empty():print("Stack is empty.")return Noneitem = self.data[self.top]self.top -= 1return itemdef peek(self):if self.is_empty():print("Stack is empty.")return Nonereturn self.data[self.top]def size(self):return self.top + 1def clear(self):self.top = -1上述代码实现了一个基本的栈,其中使用一个列表`data` 来存储栈的元素,`top` 表示栈顶指针,初始值为-1。
实验二 堆栈和队列基本操作的编程实现
HUBEI UNIVERSITY OF AUTOMOTIVE TECHNOLOGY
数据结构
实验报告
实验二堆栈和队列基本操作的编程实现
【实验目的】
堆栈和队列基本操作的编程实现
要求:
堆栈和队列基本操作的编程实现(2学时,验证型),掌握堆栈和队列的建立、进栈、出栈、进队、出队等基本操作的编程实现,存储结构可以在顺序结构或链接结构中任选,也可以全部实现。
也鼓励学生利用基本操作进行一些应用的程序设计。
【实验性质】
验证性实验(学时数:2H)
【实验内容】
内容:把堆栈和队列的顺序存储(环队)和链表存储的数据进队、出队等运算其中一部分进行程序实现。
可以实验一的结果自己实现数据输入、数据显示的函数。
利用基本功能实现各类应用,如括号匹配、回文判断、事物排队模拟、数据逆序生成、多进制转换等。
【注意事项】
1.开发语言:使用C。
2.可以自己增加其他功能。
【实验分析、说明过程】
【思考问题】
【实验小结】 (总结本次实验的重难点及心得、体会、收获)。
天大数据结构_实验作业二_栈(顺序栈)+队列(循环队列)
实验作业二:栈(顺序栈)和队列(循环队列)1. 将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。
当第0号栈的栈顶指针top[0]等于-1时该栈为空,当第1号栈的栈顶指针top[1]等于m时该栈为空。
两个栈均从两端向中间增长。
当向第0号栈插入一个新元素时,使top[0]增1得到新的栈顶位置,当向第1号栈插入一个新元素时,使top[1]减1得到新的栈顶位置。
当top[0]+1 == top[1]时或top[0] == top[1]-1时,栈空间满,此时不能再向任一栈加入新的元素。
试定义这种双栈(Double Stack)结构的类定义,并实现判栈空、判栈满、插入、删除算法。
2. 求fibonacci数列算法,并比较。
(递归+非递归)(非递归方法可查阅其他资料)编写实习报告要求:一、需求分析二、概要设计1.抽象数据类型2.算法三、详细设计程序代码(注释)四、调试分析调试过程中所做的工作,时间复杂度等五、测试结果输入数据和输出数据示例六、说明(如果有)编程语言:C语言或C++语言实习报告提交方式:下次上机前,将实习报告(.doc)和源程序(.cpp)压缩成一个rar 文件,文件名称为学号_班级_姓名_第几次作业。
例如:3010216155_六班_张三_第二次作业.rar。
实习报告作为本课程的平时成绩。
抄袭、雷同,双方均为0分。
第一题:一、需求分析程序要求建立一个共享栈,分配一个存储空间,两个栈分别位于两头。
并实现对两个栈的插入,删除,和判断栈满和栈空。
栈的位置不同,所以要求对不同栈的插入和删除采用不同的算法。
二、概要设计1.抽象数据类型typedef struct {int *base;int *top;int stacksize;}stack;2.算法1.建立栈。
int instack(stack &s,stack &w,int length){s.base=(int *)malloc(length*sizeof(length));w.base=s.base+length;if(!s.base||!w.base) return 0;else{s.top=s.base;w.top=w.base;s.stacksize=length;w.stacksize=length;}return 1;}2.判断栈空。
栈的实验报告
栈的实验报告栈的实验报告引言:栈是一种常用的数据结构,它具有先进后出(Last In First Out, LIFO)的特点。
在本次实验中,我们将通过编写代码实现栈的基本操作,并进行相应的测试和分析。
一、栈的定义和基本操作栈是一种线性数据结构,它可以通过数组或链表来实现。
栈的基本操作包括入栈(push)、出栈(pop)、获取栈顶元素(top)以及判断栈是否为空(isEmpty)等。
二、栈的实现在本次实验中,我们选择使用数组来实现栈。
首先,我们需要定义一个栈的结构体,其中包含一个整型数组和一个指向栈顶的指针。
具体的代码如下所示:```c#define MAX_SIZE 100typedef struct {int data[MAX_SIZE];int top;} Stack;```接下来,我们可以实现栈的基本操作。
具体的代码如下所示:```c// 初始化栈void initStack(Stack *s) {s->top = -1;}// 判断栈是否为空int isEmpty(Stack *s) {return s->top == -1;}// 判断栈是否已满int isFull(Stack *s) {return s->top == MAX_SIZE - 1; }// 入栈void push(Stack *s, int value) {if (isFull(s)) {printf("Stack is full.\n");return;}s->data[++s->top] = value;}// 出栈int pop(Stack *s) {if (isEmpty(s)) {printf("Stack is empty.\n");return -1;}return s->data[s->top--];}// 获取栈顶元素int top(Stack *s) {if (isEmpty(s)) {printf("Stack is empty.\n");return -1;}return s->data[s->top];}```三、栈的测试与分析为了验证我们实现的栈是否正确,我们可以编写一些测试代码来进行验证。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
青岛理工大学课程实验报告
及实验步骤只要X不为0重复做下列动作将X%R入栈
X=X/R
只要栈不为空重复做下列动作栈顶出栈
输出栈顶元素
调试过程及实验结果根据输入的十进制数通过桟的基本操作可以转换成二进制、八进制、十六进制的数。
在上机过程中程序的调用没有太大的问题,按照课本的基本算法就可以将程序正确的运行。
总结程序可以完成基本的功能,可以将十进制数转换为其他进制的数,基本掌握了桟的几种常用的操作;
但程序存在缺陷,就是不能持续进行操作,输入了一个十进制数只能进行一次数制转换,程序就会退出,有待改进。
附录#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define stack_init_size 100
#define stackincrement 10
typedef struct sqstack
{
int *base;
int *top;
int stacksize;
} sqstack;
int StackInit(sqstack *s)
{
s->base=(int *)malloc(stack_init_size *sizeof(int));
if(!s->base)
return 0;
{
return 0;
}
}
int conversion(sqstack *s)
{
int n,e=0,flag=0;
printf("输入要转化的十进制数:\n");
scanf("%d",&n);
printf("要转化为多少进制:2进制、
8进制、16进制填数字!\n");
scanf("%d",&flag);
printf("将十进制数%d转化为%d进
制是:\n",n,flag);
while(n)
{
s->top=s->base;
s->stacksize=stack_init_size;
return 1;
}
int Push(sqstack *s,int e)
{
if(s->top-s->base>=s->stacksize)
{
s->base=(int
*)realloc(s->base,(s->stacksize+stackincrement)*sizeof(int)); if(!s->base)
return 0;
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement;
}
*(s->top++)=e;
return e;
}
int Pop(sqstack *s,int e)
{
if(s->top==s->base)
return 0;
e=*--s->top;
return e;
}
int stackempty(sqstack *s)
{
if(s->top==s->base)
{
return 1;
}
else
Push(s,n%flag);
n=n/flag;
}
while(!stackempty(s)) {
e=Pop(s,e);
switch(e)
{
case 10: printf("A");
break;
case 11: printf("B");
break;
case 12: printf("C");
break;
case 13: printf("D");
break;
case 14: printf("E");
break;
case 15: printf("F");
break;
default: printf("%d",e); }
}
printf("\n");
return 0;
}
int main()
{
sqstack s;
StackInit(&s); conversion(&s);
return 0;
}。