java顺序栈的主函数怎么写_【数据结构之旅】顺序栈的定义、初始化、空栈判断、⼊栈、出栈操作...
baband说明:
往前学习数据结构,想运⾏⼀个完整的顺序栈的程序都运⾏不了,因为书上给的都是⼀部分⼀部分的算法,并没有提供⼀个完整可运⾏的程序,听了实验课,⾃⼰折腾了⼀下,总算可以写⼀个⽐较完整的顺序栈操作的⼩程序,对于栈也慢慢开始有了感觉。下⾯我会把整个程序拆开来做说明,只要把这些代码放在⼀个⽂件中,⽤编译器就可以直接编译运⾏了。
⼀、实现
1.程序功能
关于栈操作的经典程序,⾸当要提及进制数转换的问题,利⽤栈的操作,就可以⼗分快速地完成数的进制转换。
2.预定义、头⽂件导⼊和类型别名
代码如下:
#include
#include
#define OVERFLOW -1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OK 1
typedef int ElemType;
typedef int Status;
除了两个头⽂件的导⼊是必须的之外,下⾯做两点说明:
圣诞节英文怎么说
(1)其余的常量定义都是可选的,为的就是在下⾯的代码书写过程中可以尽量使⽤英⽂来表达程序的意思,⽽不是在代码的实现过程中直接使⽤数字,依个⼈喜欢,也可以直接使⽤数字;
(2)使⽤typedef做类型的别名也仅仅是为了程序中代码的意思更加清晰明了⽽已,实际也可以不这样使⽤;
3.顺序栈的定义
代码如下:
typedef struct{
ElemType *elem; //存储空间的基址
elizabeth holmesint top; //栈顶元素的下⼀个元素,简称栈顶位标
int size; //当前分配的存储容量,作⽤看⼊栈操作就可以知道
int increment; //扩容时,增加的存储容量,作⽤看⼊栈操作就可以知道
} SqStack; //顺序栈名称
4.栈的初始化
代码如下:
Status InitStack_Sq(SqStack &S, int size, int inc){ //接受3个参数,&S是对结构体的引⽤S.elem = (ElemType*)malloc(size*sizeof(ElemType)); //分配存储空间
ignore是什么意思
if(S.elem == NULL) return OVERFLOW; //判断上⼀步分配存储空间是否成功
S.size = size; //栈的空间初始容量值
S.increment = inc; //栈的空间初始增量值(如果需要扩容)
return OK; //上⾯的执⾏正常,返回OK
}
5.空栈的判断
代码如下:
Status StackEmpty_Sq(SqStack S){
p == 0)
return TRUE;
el
return FALSE;
}
//空栈的决断是,如果栈为空就返回1,否则就返回0,当然可以不这样规定;
//⾄于为什么要做空栈的判断,⾃然是有原因的,下⾯再看程序的代码时就可以知道了。
6.⼊栈
代码如下:
Status Push_Sq(SqStack &S, ElemType e){ //将元素e压⼊栈,这⾥e只是⼀个形参⽽已ElemType *newba; //定义中间变量
p>= S.size){ //S.top如果指向最后⼀个不存储元素的地址时,即S.top⼤于
newba = (ElemType*)realloc(S.elem, //等于S.size时,就表⽰栈满了
(S.size + S.increment)*sizeof(ElemType)); //通过realloc动态扩容
if(NULL == newba) return OVERFLOW; //判断扩容是否成功
S.elem = newba; //扩容成功后才将中间变量的值指向S.elem,防⽌扩容失败时,
S.size = S.size + S.increment; //S.elem指向⼀个不是原来的位置
}
mp3铃声免费下载
S.p] = e; //将e元素⼊栈
return OK; //上⾯操作正常后返回1
}
7.出栈
代码如下:
Status Pop_Sq(SqStack &S, ElemType &e){ //栈顶元素出栈,赋给元素e
if(0 == S.top) return ERROR;
e = S.elem[--S.top]; //e出栈,并将S.top减1
return OK;
}
8.进制转换的函数
其实上⾯的步骤操作都是为了创建⼀个顺序栈和定义顺序栈的操作⽽已,并对可能出现的各种情况做⼀些相应的举措,完毕后,下⾯就要使⽤上⾯创建的顺序栈以及栈的操作接⼝了,即在数制转换函数(这⾥是⼗进制转⼋进制)中使⽤上⾯的操作接⼝,代码如下:
void Converstion(int N){
SqStack S;
ElemType e;
InitStack_Sq(S, 10, 5); //栈S的初始容量置为10,每次扩容容量为5
while(N != 0){
Push_Sq(S, N%8); //将N除以8的余数⼊栈
N /= 8; //N取值为其除以8的商
} //理论基础为除8取余法免费韩语
while(StackEmpty_Sq(S) == FALSE){
Pop_Sq(S, e); //依次输出栈中的余数,并赋给元素e
printf("%d", e); //打印元素
}
9.main函数
进制转换函数调⽤栈操作的接⼝函数,以实现在数制转换过程中栈的操作;main函数调⽤数制转换函数,以实现数制的转换,代码如下:
int main(void){儿童节的英文
printf("Enter a number:");scanf("%d",&num);
Converstion(num);
printf("\n");
}toysrus
⼆、执⾏
有了上⾯的代码后,就可以在编译器中编译执⾏了,这⾥我是⽤c free 5来进⾏程序代码的编译:
(1)输⼊的数为1348时的结果:
(2)输⼊的数为2526时的结果:
三、完整的代码
下⾯把代码都放在⼀起:
#include
#include
#define OVERFLOW -1
#define ERROR 0
#define FALSE 0
#define TRUE 1
#define OK 1
typedef int ElemType; typedef int Status;
typedef struct{
ElemType *elem;
int top;
int size;
int increment;
} SqStack;
Status InitStack_Sq(SqStack &S, int size, int inc){ S.elem = (ElemType*)malloc(size*sizeof(ElemType)); if(S.elem == NULL) return OVERFLOW;
S.size = size;
S.increment = inc;
return OK;
}
Status StackEmpty_Sq(SqStack S){
p == 0)
return TRUE;
el
return FALSE;
崇文门新世界电话
}
Status Push_Sq(SqStack &S, ElemType e){ ElemType *newba;
p>= S.size){
newba = (ElemType*)realloc(S.elem,
(S.size + S.increment)*sizeof(ElemType));
if(NULL == newba) return OVERFLOW;
S.elem = newba;
S.size = S.size + S.increment;
}
S.p] = e;
return OK;
}
Status Pop_Sq(SqStack &S, ElemType &e){
if(0 == S.top) return ERROR;
e = S.elem[--S.top];
日文翻译