C语言(C++)数据结构栈的基本操作函数

数据结构里面都学过的,栈的结构体建立。将栈的基本操作函数单独编写成头文件,在之后使用时便可直接调用头文件,不必再在函数内编写。同时也编写了对各项功能检验的主函数代码,有需要的转走记得点赞加关注噢。

文件头及结构体定义

#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define STACK_INIT_SIZE 100    //存储空间初始分配量
#define STACKINCREMENT 10      //存储空间分配增量 
#define OVERFLOW -1
#define OK 1
#define ERROR 0
typedef char SElemtype;
typedef int Status;

typedef struct
{
	SElemtype *base;              //栈底指针,在栈构造之前和销毁之后,base的值为NULL
	SElemtype *top;               //栈顶指针
	int stacksize;                //栈的容量,即当前已分配的存储空间
}SqStack;

栈的初始化

Status InitStack(SqStack *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;
}

销毁栈

Status DestroyStack(SqStack *S)
{
	free((*S).base);                              //释放栈的存储空间
	(*S).base=(*S).top=NULL;                      //栈顶和栈底均为空
	(*S).stacksize=0;                             //栈的容量为0
	return OK;
}

清空栈 

Status ClearStack(SqStack *S)
{
	(*S).top=(*S).base;                            //栈顶等于栈底,且栈的容量为0
	(*S).stacksize=0;
	return 0;
}

判断栈是否为空

Status StackEmpty(SqStack S)                      
{
	if(S.base==S.top)                        //若栈顶与栈底相同,则说明栈为空,则返回true,否则返回false
		return true;
	else
		return false;	
}

求栈的长度

int StackLength(SqStack S)            
{
	return S.top-S.base;                      //元素个数即栈的长度即为栈顶-栈底
}

取栈顶元素 

Status GetTop(SqStack S,SElemtype &e)
{
	if(S.top == S.base ) return ERROR;       
	e = *(S.top-1);               //因为栈顶指针始终指向栈顶元素的下一个位置上,所以我们要让栈顶指针减一,并用e传回栈顶元素的值
	return OK;
}

入栈

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;                                  //将元素插入至栈顶位置,且栈顶+1,指向下一位置
	return OK;
}

出栈

Status Pop(SqStack &S,SElemtype &e)
{
	if(S.top == S.base) return ERROR;
	e=*(--S.top);	                             //将栈顶元素取出,且栈顶-1
	return OK;
}

输出栈内元素

Status StackTraverse(SqStack S)
{
	SElemtype *p;
	p=S.base;                                     //依次从栈底开始,将栈内元素逐一调用输出,栈的位置逐渐+1,直至栈顶
	while(p!=S.top)
	{
		printf("%d  ",*p);
		p++;
	}
	printf("\n");
	return OK;
}

当此头文件编写成功后,需要验证这些基本操作函数是否能完成功能,完整的功能验证代码如下,

其中使用swith语句可以实现用户交互界面的功能选择表,更加美观。

#include<stdio.h>
#include<stdlib.h>
#include"SqStack.h"
using namespace std;
int main()
{
	int i,x;
	SqStack S;
	SElemtype e;           //入栈的元素
	SElemtype m;           //出栈的元素
	SElemtype topelem;     //栈顶元素
	while(true)
	{
		printf(" 1.初始化栈\n");
		printf(" 2.销毁栈\n");
		printf(" 3.清空栈\n");
		printf(" 4.栈判空\n");
		printf(" 5.求栈长度\n");
		printf(" 6.获取栈顶元素\n");
		printf(" 7.插入一个 元素\n");
		printf(" 8.删除一个元素\n");
		printf(" 9.输出所有元素\n");
		printf("请输入数字(输入负数退出):\n");
		scanf("%d",&i);
		if(i<0)
			break;
		if(i>0&&i<10)
		{
			switch(i)
			{
				case 1:    
				    InitStack(&S);      
					if(InitStack(&S))
					{
						printf("初始化成功\n");
					}else
					{
						printf("初始化失败\n");
					}
					system("pause");
					break;
				case 2:
					if(DestroyStack(&S))
					{
						printf("销毁成功\n");
					}
					system("pause");
					break;
				case 3:
				    if(!StackEmpty(S))
					{
						ClearStack(&S);
						if(StackEmpty(S))
						{printf("栈已清空\n");}	
						else
						{
							printf("栈为情况");
						}
					}
					else
					{
						printf("栈不存在\n");
					}
					system("pause");
					break;
				case 4:
					if(StackEmpty(S))
					{
						printf("栈空\n");
					}else
					{
						printf("栈不空\n");
					}	
					system("pause");
					break;
				case 5:
					if(!StackEmpty(S))
					{
						printf("栈中有%d个元素\n",StackLength(S));		
					}else if(StackEmpty(S))
					{
						printf("栈中没有元素\n");
					}else
					{
						printf("栈不存在\n");
					}
					system("pause");
					break;
				case 6:
					if(!StackEmpty(S))
					{
						GetTop(S,topelem);
						printf("栈顶元素为%d\n",topelem);
					}else if(StackEmpty(S))
					{
						printf("栈中没有元素\n");
					}else
					{
						printf("栈不存在\n");
					}
					system("pause");
					break;
				case 7:
					printf("请输入你所要插入的元素\n");
					scanf("%d",&e);
					Push(S,e);							
					system("pause");
					break;	
				case 8:
					if(!StackEmpty(S))
					{
						Pop(S,m);
						printf("你删除的元素是%d\n",m);
					}else if(StackEmpty(S))
					{
						printf("栈中没有元素\n");
					}else
					{
						printf("栈不存在\n");
					}						
					system("pause");
					break;
				case 9:
					if(!StackEmpty(S))
					{
						StackTraverse(S);
					}else if(StackEmpty(S))
					{
						printf("栈中没有元素\n");
					}else
					{
						printf("栈不存在\n");
					}						
					system("pause");
					break;	
			}
		}else
		{
			printf("没有这个选项\n");
		}
		system("cls");
	}
}

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值