c语言实现栈的相关操作

栈是限定仅仅在表尾进行插入或删除操作的线性表

下面的代码

#include<stdio.h>
#include<malloc.h>
#include<stdbool.h>
#include<Windows.h>//windows平台的输出端代码颜色控制
#define STACT_INIT_SIZE 100//存储空间初始分配量
constexpr auto STACKINCEREMENT = 10;//存储空间分配增量
typedef int  SElemType;//栈中元素类型
typedef struct {
	SElemType* base;//栈底
	SElemType* top;//栈顶
	int stacksize;//当前已经分配的存储空间
}SqStack;
//---------基本操作的函数原型说明-----------
void InitStack(SqStack &s );//构造一个空栈
void DestoryStack(SqStack &s);//销毁栈
void StackEmpty(SqStack &s);//判断栈是否为空
int Stacklength(SqStack &s);//若栈不为空得到栈的长度
int GetTop(SqStack s);//若栈不为空得到栈顶元素
void Push(SqStack  &s,SElemType e);//入栈
void Pop(SqStack &s);//出栈
void StackTRaverse(SqStack s);//遍历,输出栈中 的每一个元素
//-----------基本操作的程序实现--------
void InitStack(SqStack	&s)//构造一个空栈
{
	s.base = (SElemType*)malloc(STACT_INIT_SIZE * sizeof(int));
	if (!s.base)
		return;//分配空间失败
	s.top = s.base;//栈的初始状态
	s.stacksize = STACT_INIT_SIZE;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);//颜色代码
	printf("\t栈已经创建好啦!\n");
}

void DestoryStack(SqStack &s)//销毁栈
{
	free(s.base);
	s.base = NULL;
	s.stacksize = 0;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
	printf("\t栈销毁成功啦!\n");
}

void StackEmpty(SqStack& s)//判断栈是否为空
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
	if (s.base == s.top || s.base > s.top)
		printf("\t空栈\n");
	else
	{
		printf("\t栈不为空\n");
	}
}

int Stacklength(SqStack& s)//若栈不为空得到栈的长度
{
	if(s.top>=s.base)
		return s.top-s.base;
}

int  GetTop(SqStack s)//若栈不为空得到栈顶元素
{
	if (s.base < s.top)
	{
		s.top=s.top-1;
		return *s.top;
	}
	
}

void Push(SqStack &s, SElemType e)//插入e为栈中元素
{
	if (s.top - s.base >= s.stacksize)
	{
		s.base = (SElemType*)realloc(s.base, (s.stacksize + STACKINCEREMENT )* sizeof(SElemType));	
		if (!s.base)
			return;
		s.top = s.base + s.stacksize;
		s.stacksize += STACKINCEREMENT;
	}
	*s.top = e;
	s.top++;
}

void Pop(SqStack& s)
{
	if (s.base == s.top)
		return;
	s.top--;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
	printf("\t出栈成功啦!\n");
}

void StackLength(SqStack s)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
	if(s.base!=s.top)
		printf("\t栈的长度是%d\n",(s.top - s.base));
}

void StackTRaverse(SqStack s)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
	if (s.base == s.top)
		return;
	while (s.top != s.base)
	{
		printf("\t栈元素是:%d\n", *s.base);
		s.base++;
	}
}

void meanu()
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
	printf("\t\t\t*****------^*^--------*****\n");
	printf("*****\t1-->创建一个空栈\t\t2-->栈元素入栈    \t*****\n");
	printf("*****\t3-->遍历栈      \t\t4-->获得栈顶元素  \t*****\n");
	printf("*****\t5-->栈元素出栈  \t\t6-->求得栈长度    \t*****\n");
	printf("*****\t7-->销毁栈      \t\t8-->判断是否为空栈\t*****\n");
	printf("*****\t9-->退出程序\n");
}
int main()
{

	SqStack s;
	bool flag = 1;
	meanu();
	while(flag)
	{
	int choice;
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0X001);
	printf("请输入你的选择:");
	scanf_s("%d", &choice);
	switch (choice)
		{
		
	case 1:InitStack(s); break;
	case 2: {
		int a, e;
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
		printf("\t请输入入栈元素个数:\n\t ");
		scanf_s("%d", &a);
		for (int i = 0; i < a; i++)
		{
			printf("\t\t请输入第%d个入栈元素:\n\t\t", i + 1);
			scanf_s("%d", &e);
			Push(s, e);
		}
	}; break;
	case 3:StackTRaverse(s); break;
	case 4:
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
		printf("\t栈顶元素是%d\n", GetTop(s));
			break;
	case 5:Pop(s); break;
	case 6:StackLength(s); break;
	case 7:DestoryStack(s); break;
	case 8:StackEmpty(s); break;
	case 9:
		flag = 0;//程序结束
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0X07);
		printf("\t成功退出!\n");
		break;
		}
	}
}
发布了15 篇原创文章 · 获赞 0 · 访问量 228

猜你喜欢

转载自blog.csdn.net/qq_44423388/article/details/103930224