数据结构中顺序栈的基本函数运用,包括创建空栈,初始化,清空,销毁,增加,删除,遍历等函数

不多说,直接上货,代码如下:


建立C++项目

 

第一个1头文件:基本的头文件、定义

#include"stdio.h"
#include"stdlib.h"
#include"iostream"
#define OK 1
#define FALSE -1
#define TURE 1
#define ERROR -1
#define OVERFLOW       -1
#define INFEASIBLE        -1
#define STACK_INIT_SIZE    100  
#define STACKINCREMENT     10 
typedef int SElemType;
typedef int Status;
typedef struct {
SElemType *base;//栈底
SElemType *top;//栈顶
int stacksize;//栈当前最大容量
}SqStack;


第二个头文件:基本操作函数


#include"header.h"//基本操作算法
//1、构造空栈
int InitStack(SqStack &S)
{   int a,i;
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
printf("正在准备初始化输入......");
printf("\n\n");
printf("请输入栈中元素个数: ");
scanf_s("%d",&a);  //a为栈中元数个数
printf("\n");
printf("请向栈中输入元素\n");
printf("\n");
for (i = 1; i <= a; i++)
{
printf("请输入第%d个元素: ",i);
scanf_s("%d",&(*S.top));
     printf("\n");
S.top=S.top+1;
}
return OK;
}
//2、销毁栈
void DestoryStack(SqStack &S)
{
 free(S.base);
}


//3、清空栈
void  ClearStack(SqStack &S)
{
while (S.top != S.base)
{
free(--S.top);
S.top--;
}
}


//4、判空栈
Status StackEmpty(SqStack &S)
{
if(S.top==S.base)
return TURE;
else
return ERROR;
}
//5、求栈长
Status StackLength(SqStack &S)
{  
  return S.top-S.base;
}


//6、取栈顶
Status GetTop(SqStack S)
{   
    SElemType e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
//7、插入
Status Push(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;
S.top++;
return OK;
}
    


//8、删除栈顶元素
Status Pop(SqStack &S,SElemType &e)
{
if(S.top==S.base)
return ERROR;
S.top=S.top-1;
e=*S.top;
return e;
}
//9、遍历
void StackTraverse(SqStack &S)
{   SElemType *p;
    for(p=S.top-1;p>=S.base;p--)
{
printf("%5d",*p);
}


}



主函数:测试用


#include "stdafx.h"
#include"header1.h"
int main()
{   
int e,n;
    SqStack S;
    InitStack(S);//初始化


printf("\n栈是否为空");
if(StackEmpty==0)//判空
printf("\nYES");
printf("\nNO");
printf("\n");


printf("栈长为:%d\n", StackLength(S));//栈长
printf("\n");


printf("栈顶元素为:%d\n",GetTop(S));
printf("\n");//取栈顶


printf("删除栈顶元素:%d",Pop(S,e));
printf("\n\n");
printf("现在栈中元素为:");
StackTraverse(S);//遍历




printf("\n请输入插入的值:");
scanf_s("%d", &e);
Push(S, e);
printf("\n");
printf("现在栈中元素为:");
StackTraverse(S);//遍历
printf("\n");
return 0;
}


  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于编写顺序表的初步初始化、插入、遍历三个基本操作函数,可以使用以下代码实现。 1. 初步初始化操作函数: def init_seq_list(seq_list, size): for i in range(size): seq_list.append(0) 其,seq_list代表顺序表,size代表顺序表的大小。 2. 插入操作函数: def insert_seq_list(seq_list, pos, value): seq_list.insert(pos, value) 其,seq_list代表顺序表,pos代表插入的位置,value代表插入的数值。 3. 遍历操作函数: def traverse_seq_list(seq_list): for i in range(len(seq_list)): print(seq_list[i]) 其,seq_list代表顺序表。 以上三个操作函数都是顺序表基本操作函数,通过调用这些函数可以实现顺序表的各种操作,比如插入、查找、删除等。 ### 回答2: 顺序表是一种常用的数据结构,具有结构简单、存取方便、随机存储等特点。在使用顺序表时,我们需要编写一些基本的操作函数,如初始化、插入、遍历等。下面,我将详细介绍编写这三个基本操作函数的方法。 1. 初始化顺序表 初始化顺序表是指对顺序表进行一些必要的预处理,如初始化表长、分配存储空间等。初始化顺序表的函数一般形式如下: void InitList(SqList &L) { L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if(!L.elem) exit(ERROR); L.length = 0; L.listsize = LIST_INIT_SIZE; } 在初始化函数,我们首先分配一块存储空间,即使用malloc函数动态分配一段内存空间,并将其首地址赋值给L.elem,如果分配不成功则退出。然后,我们将L.length赋值为0,表示表元素个数为0;L.listsize赋值为LIST_INIT_SIZE,表示当前分配的存储空间大小为LIST_INIT_SIZE,LIST_INIT_SIZE一般是一个常量。至此,我们完成了顺序表的初始化操作。 2. 插入元素 向顺序表插入元素是常见的操作,有时我们需要在表间或头部插入元素,有时需要在表尾插入元素。不论在何处插入元素,我们需要确保插入后元素的顺序不变,并且当存储空间不足时,需要进行动态扩容。一个插入元素的函数一般形式如下: bool ListInsert(SqList &L, int i, ElemType e) { if(i < 1 || i > L.length + 1) return false; if(L.length >= L.listsize) { ElemType *newBase; newBase = (ElemType *)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType)); if(!newBase) exit(ERROR); L.elem = newBase; L.listsize += LISTINCREMENT; } ElemType *p, *q; q = &(L.elem[i-1]); for(p = &(L.elem[L.length-1]); p >= q; --p) *(p+1) = *p; *q = e; ++L.length; return true; } 在函数,我们首先判断插入的位置是否合法,即i的值是否在合法范围内;当存储空间不足时,我们需要动态扩容,即调用realloc函数重新分配一块内存空间,将L.elem指向新分配的空间,同时更新L.listsize的值。接着,我们采用类似于冒泡排序的方式,将表的元素逐个向后移动一位,为插入元素腾出位置。最后,将待插入元素e放入q指向的位置,并将L.length的值加1,表示表元素个数增加了1。 3. 遍历顺序表 遍历顺序表是指对表所有元素依次执行某些操作,如输出表所有元素或对元素进行处理等。遍历顺序表的函数可用于统计各类元素的个数、查找符合条件的元素等。一个遍历顺序表的函数一般形式如下: void ListTraverse(SqList L) { ElemType *p = L.elem; for(int i = 1; i <= L.length; ++i) { printf("%d ", *p); ++p; } printf("\n"); } 在函数,我们首先定义一个指向L.elem的指针p,并设置初始值为L.elem,随后采用for循环的方式依次遍历所有元素,将每个元素的值输出,并将指针p向后移动一位。最后,我们在末尾输出一个换行符。\end{document} ### 回答3: 顺序表是数据结构最基础的线性结构,其基本操作包括初始化、插入和遍历。本文将介绍如何编写顺序表的三个基本操作函数。 1. 初始化函数 初始化函数是顺序表最基本的操作函数,其作用是初始化并建立一个空的顺序表,常用于顺序表的创建和重置。 初始化函数通常包括以下步骤: (1)动态申请容量为maxsize的存储空间。 (2)判断是否申请成功,若失败则返回错误信息。 (3)将顺序表的当前长度置为0,表示当前顺序表为空。 (4)将顺序表的最大容量maxsize赋值给顺序表表头。 以下是顺序表初始化函数的代码实现: #define MAXSIZE 100 //顺序表最大容量 typedef struct{ DataType data[MAXSIZE]; //顺序表存储数据元素的数组 int length; //顺序表当前长度 int maxsize; //顺序表最大容量 }SeqList; //顺序表类型定义 SeqList* InitList(){ SeqList* L=(SeqList*)malloc(sizeof(SeqList)); //动态申请存储空间 if(!L){ printf("Memory allocation failed.\n"); exit(0); //退出程序 } L->length=0; L->maxsize=MAXSIZE; //将最大容量赋值给表头 return L; } 2. 插入函数 顺序表的插入操作是向表插入一个元素,使得该元素成为指定位置后面的元素。插入函数的常用形式包括插入到表头、插入到表尾和插入到指定位置。 插入函数常用的步骤如下: (1)判断插入位置pos是否合法,即pos>=1&&pos<= length+1,其length表示当前顺序表长度。 (2)若pos>length,则新插入的元素在表尾。否则需将插入位置之后的元素依次往后移动一位,为新元素腾出插入位置。 (3)将新的元素插入到合适的位置。 (4)将顺序表的当前长度增加1。 以下是向顺序表插入一个元素的代码实现: bool InsertList(SeqList* L,int pos,DataType x){ if(pos<1||pos>L->length+1){ //插入位置不合法 return false; } if(L->length>=L->maxsize){ //存储空间已满,无法插入新元素 return false; } for(int i=L->length;i>=pos;i--){ //将插入位置之后的元素依次往后移动一位 L->data[i+1]=L->data[i]; } L->data[pos]=x; //新元素插入到合适的位置 L->length++; //顺序表长度增加1 return true; } 3. 遍历函数 顺序表的遍历操作是按照元素顺序依次访问每个元素,并对其进行某些操作,如输出、修改、删除等。遍历函数常用的方式包括顺序遍历和倒序遍历。 顺序遍历顺序表的实现方法很简单,只需要使用for循环按顺序访问每一个元素即可。 倒序遍历顺序表则需要使用while循环,并从末尾元素开始依次向前访问顺序表的所有元素。 以下是顺序遍历顺序表的代码实现: void PrintList(SeqList* L){ for(int i=1;i<=L->length;i++){ printf("%d ",L->data[i]); } printf("\n"); } 以上就是顺序表的初始化、插入和遍历三个基本操作函数的代码实现。需要注意的是,在实现每个操作函数时,都要考虑到可能出现的异常情况,如内存不足、插入位置不合法、存储空间已满等情况,并返回相应的错误信息。在使用顺序表时,也要注意合理地控制顺序表的大小,避免浪费过多存储空间或造成空间不足的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值