数据结构-顺序栈(C语言实现)

278 阅读4分钟
  • 头文件
#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED

typedef enum Status 
{
	ERROR = 0, SUCCESS = 1
} Status;

typedef int ElemType;

typedef struct SqStack 
{
	ElemType *elem;
	int top;
	int size;
} SqStack;

//基于数组的顺序栈
Status initStack(SqStack *s,int sizes);//初始化栈

Status isEmptyStack(SqStack *s);//判断栈是否为空

Status getTopStack(SqStack *s,ElemType *e); //得到栈顶元素

Status clearStack(SqStack *s);//清空栈

Status destroyStack(SqStack *s);//销毁栈

Status stackLength(SqStack *s,int *length);//检测栈长度

Status pushStack(SqStack *s,ElemType data);//入栈

Status popStack(SqStack *s);//出栈

void outStack(SqStack* s);//遍历输出栈

void checkinput(int* r);
#endif 
  • 函数定义
#include"SqStack.h"
#include <stdio.h>
#include <stdlib.h>
Status initStack(SqStack* s, int sizes) {//初始化栈
	s->elem = (ElemType*)malloc(sizes * sizeof(ElemType));//分配内存空间
	if (!s->elem)
		return ERROR;//数据指针没有分配到空间,报错
	s->top = -1;//若栈此时为空栈时,栈顶指针 top = -1 
	s->size = sizes;//定义栈的大小
	return SUCCESS;
}
Status isEmptyStack(SqStack* s)//要判断栈是否为空,顺序栈就是看 s->top 是不是等于 -1
{
	if (s->elem==NULL) {//其实可以设计一个判断函数,懒得写了,直接复制粘贴,而且我只能这样去判断你到底有没有创建顺序栈
		printf("请先输入【1】创建顺序栈!\n");
	}
	else if (s->top == -1) {
		printf("这是一个空栈!\n");
		return SUCCESS;
	}
	else {
		printf("这不是一个空栈!\n");
		return ERROR;
	}
}
Status getTopStack(SqStack* s, ElemType* e)
{
	if (s->elem==NULL) {
		printf("请先输入【1】创建顺序栈!\n");
	}
	else if (s->top == -1) {
		printf("这是一个空栈!\n");
		return ERROR;
	}
	else {
		*e = s->elem[s->top];//e指针返回栈顶元素地址
		printf("栈顶元素为:%d\n", *e);
		return SUCCESS;
	}

}
Status clearStack(SqStack* s)
{
	if (s->elem==NULL) {
		printf("请先输入【1】创建顺序栈!\n");
		return ERROR;
	}
	else if (s->top == -1) {
		printf("这是一个空栈!\n");
		return ERROR;
	}
	else {
		s->top = -1;//栈顶指针作为栈的边界
		printf("清空成功!\n");
		return SUCCESS;
	}
}
Status destroyStack(SqStack* s)
{
	if (s->elem==NULL) {
		printf("请先输入【1】创建顺序栈!\n");
		return ERROR;
	}
	else {
		free(s->elem);//申请的空间全释放
		s->elem = NULL;
		printf("销毁成功!\n");
		return SUCCESS;
	}
}
Status stackLength(SqStack* s, int* length)
{
	if (s->elem==NULL) {
		printf("请先输入【1】创建顺序栈!\n");
		return ERROR;
	}
	else {
		*length = s->top + 1;
		printf("你的顺序栈现在的栈长为:%d\n",*length);
		return SUCCESS;
	}
}
Status pushStack(SqStack* s, ElemType data,char c[])
{
	if (s->top == s->size - 1)		//判断栈是否已满
	{
		printf("栈已满!\n");
		return ERROR;
	}
	else if (s->elem==NULL) {
		printf("请先输入【1】创建顺序栈!\n");
		return ERROR;
	}
	else {
		printf("\n你想要增加的数据是:");
		checkinput(&data);
		s->top++;
		s->elem[s->top] = data;
		printf("\n数据【%d】压栈成功\n", data);
		return SUCCESS;
	}
}
Status popStack(SqStack* s)
{
	if (s->top == -1) {
		printf("这是一个空栈!\n");
		return ERROR;
	}
	else if (s->elem==NULL) {
		printf("请先输入【1】创建顺序栈!\n");
		return ERROR;
	}
	else {
		printf("数据【%d】出栈成功!\n", s->elem[s->top]);
		s->top--;
		return SUCCESS;
	}
}
void outStack(SqStack* s) {
	int i;
	if (s->top==-1) {
		printf("\n这是一个空栈!\n");
	}
	else if(!s->elem){
		return;
	}
	else {
		for (i = 0; i <= s->top; i++) {
			printf("\n第%d个数据是:%d\n", i + 1, s->elem[i]);
		}
	}
}
void checkinput(int* r) {
	int error = 0, i = 0;
	char c[50] = { 0 };
	do {
		gets(c);
		error = 0;
		for (i = 0; c[i] != '\0'; i++) {
			if (i == 0 && c[i] == '-')
			{
				continue;
			}
			if (c[i] < '0' || c[i]>'9')
				error = 1;
		}
		if (error) printf("输入错误,请重新输入!\n");
	} while (error);
	*r = atoi(c);
}
  • 函数实现
#include"SqStack.h"
#include <stdio.h>
#include <stdlib.h>
int main() {
	int i,num;
	int* length = (int*)malloc(sizeof(int));
	ElemType sizes;
	ElemType data=0;
	ElemType* e = (ElemType*)malloc(sizeof(ElemType));
	SqStack *s=(SqStack*)malloc(sizeof(SqStack));
	s->elem=NULL;
	while (1) {
		system("cls");
		printf("\t\t\t|----------------------------------|\n");
		printf("\t\t\t|         顺序栈基本操作           |\n");
		printf("\t\t\t|----------------------------------|\n");
		printf("\t\t\t|      1---创建顺序栈              |\n");
		printf("\t\t\t|      2---判断是否为空            |\n");
		printf("\t\t\t|      3---得到栈顶元素            |\n");
		printf("\t\t\t|      4---清空顺序栈              |\n");
		printf("\t\t\t|      5---销毁顺序栈              |\n");
		printf("\t\t\t|      6---获取栈长                |\n");
		printf("\t\t\t|      7---压栈                    |\n");
		printf("\t\t\t|      8---出栈                    |\n");
		printf("\t\t\t|      9---遍历输出                |\n");
		printf("\t\t\t|      10---退出                   |\n");
		printf("\t\t\t|----------------------------------|\n");
		printf("\t\t\t|                  前端-Sheldonlee |\n");
		printf("\t\t\t|----------------------------------|\n");
		printf("\n请选择操作:\n");
		checkinput(&num);
		if (num >= 1 && num <= 10) {
			switch (num) {
			case 1: {
				if (s->elem!=NULL) {
					printf("\n已存在一个顺序栈,请先销毁此栈!\n");
				}
				else {
					printf("请输入你的顺序栈长度:");
					checkinput(&sizes);
					if (sizes >= 0) {
						initStack(s, sizes);
						for (i = 0; i < sizes; i++) {
							pushStack(s, data);
						}
						printf("\n顺序栈创建成功\n");
						outStack(s);
					}
					else {
						printf("\n顺序栈初始化失败,长度输入错误!\n");
					}
				}
				break;
			}
			case 2: {
				isEmptyStack(s);
				break;
			}
			case 3: {
				getTopStack(s, e);
				outStack(s);
				break;
			}
			case 4: {
				clearStack(s);
				break;
			}
			case 5: {
				destroyStack(s);
				break;
			}
			case 6: {
				stackLength(s, length);
				break;
			}
			case 7: {
				pushStack(s, data);
				break;
			}
			case 8: {
				popStack(s);
				break;
			}
			case 9: {
				outStack(s);
				break;
			}
			case 10: 
				destroyStack(s);
				system("cls");
				printf("\n\n\n\n\n\n\n\t\t\t\t尚有很多不足之处,望多多指教!\n\n\n\n\n\n\n");
				exit(0);
				break;
			}
		}
		else
		{
			printf("\n请输入正确的数字。\n");    //错误提醒
		}
		system("pause");
	}
	return 0;
}