数据结构之顺序栈的算法实现C语言菜单版

期末数据结构实验考察我选的是顺序栈的算法实现,结合其他博客便创作了这篇文章,以供大家参考。如有错误,请斧正!!!

一、设计目的与内容

顺序栈的算法实现:重点在于理解栈的先进后出的特性,回顾课程中对栈的具体应用,例如数制转换、表达式的求值、括号匹配等应用。

二、算法的基本思想

引入了栈底指针base!
抽象类型定义:
typedef struct {
ElemType *base; // 栈底指针
ElemType *top; // 栈顶指针
int stack_size; // 栈的最大长度
} SqStack;

三、主要功能设计与实现

  1. void menu()
    功能:显示菜单
void menu()
{
   printf("==========================顺序栈的算法实现==========================\n");
   printf("**********************1.创建新栈     2.遍历栈**********************\n");
   printf("**********************3.取栈顶       4.销毁栈**********************\n");
   printf("**********************5.取栈长度     0.退出**********************\n");
}
  1. Create(S)
    功能:先初始化然后再创建新栈
Status Create(SqStack *S)
{
	int n,e,i;
	printf("初始化栈S......\n");
    InitStack(S);
	printf("成功初始化\n");
    printf("输入栈的长度 :");
    scanf("%d", &n);

    for (i = 1; i <= n; i++) {
		printf("请输入第%d个元素:",i);
        scanf("%d", &e);
        PushStack(S, e);
    }
    printf("栈为空吗?\n");

    if (EmptyStack(S)) {
        printf("Yes!\n");
    } else {
        printf("No!\n");
    }
	return 1;
  1. StackTraverse(S)
Status StackTraverse(SqStack *S) {
    ElemType *p;

    if (S->top == S->base) {
        printf("Stack is NULL.\n");
        return 0;
    }
    p = S->top;
    // 由栈顶依次向下遍历
	printf("栈顶到栈低元素依次为:");
    while (p > S->base) {
        p--;
        printf("%d ", *p);
    }
    printf("\n");
    return 1;
}
  1. GetTopStack(S)
    功能:取栈顶元素
Status GetTopStack(SqStack *S) {
	ElemType *t;
    if (S->top == S->base) {
        return 0;
    } 
    t = (S->top-1);
	printf("栈顶元素为:%d\n",*t);
    return 1;
}
  1. DestroyStack(S)
    功能:销毁已有栈
Status DestroyStack(SqStack *S) {
    free(S->base);
    S->base = S->top = NULL;
    S->stack_size = 0;
	printf("栈已成功销毁!\n");
    return 1;
}

6.LengthStack(S)
功能:获取栈的长度

Status LengthStack(SqStack *S) {
    if (S->top == S->base) {
        return 0;
    }
	printf("当前栈的长度为:%d\n",(Status) (S->top - S->base));
    return 1;
}

四、系统测试

数据结构之顺序栈的算法实现C语言菜单版_第1张图片

六、源程序及使用说明

#include 
#include 
#define Stack_Init_Size 10 // 初始化栈的最大长度
#define StackIncrement 10 // 若栈最大空间不够时,需要增加的长度
typedef int ElemType;
typedef int Status;
typedef struct {
    ElemType *base; // 栈底指针
    ElemType *top; // 栈顶指针
    int stack_size; // 栈的最大长度
} SqStack;
// 初始化栈
Status InitStack(SqStack *S) {
    // 分配初始空间
    S->base = (ElemType *) malloc(Stack_Init_Size * sizeof(ElemType));  //动态分配存储空间
    if (!S->base) {
        exit(0);
    }
    S->top = S->base; /// 栈顶与栈底相同
    S->stack_size = Stack_Init_Size; // 栈的最大长度等于初始长度
    return 1;
}
// 判断栈是否为空,只需要判断栈顶指针与栈底指针是否相同即可
Status EmptyStack(SqStack *S) {
    return S->base == S->top;

// 获取栈的实际长度,栈顶减去栈底指针即为栈的长度
Status LengthStack(SqStack *S) {
    if (S->top == S->base) {
        return 0;
    }
	printf("当前栈的长度为:%d\n",(Status) (S->top - S->base));
    return 1;
}
// 获取栈顶的元素,参数e用来存放栈顶的元素
Status GetTopStack(SqStack *S) {
	ElemType *t;
    if (S->top == S->base) {
        return 0;
    } 
    t = (S->top-1);
	printf("栈顶元素为:%d\n",*t);
    return 1;
}
// 进栈,参数e是要进栈的元素
Status PushStack(SqStack *S, ElemType e) {
    // 若栈的最大长度不会够用时,重新开辟,增大长度
    if (S->top - S->base >= S->stack_size) {
        S->base = (ElemType *)realloc(S->base, (S->stack_size + StackIncrement) * sizeof(ElemType));
        if (!S->base) {
            return 0;
        }
        // 栈顶指针为栈底指针加上栈之前的最大长度
        S->top = S->base + S->stack_size;
        // 栈当前的最大长度等于栈之前的最大长度与增加的长度之和
        S->stack_size += StackIncrement;
    }
    *S->top++ = e; // 先赋值,后栈顶指针上移
    return 1;
}
// 出栈,参数e用来存放出栈的元素
Status PopStack(SqStack *S, ElemType *e) {
    if (S->base == S->top) {
        return 0;
    }
    *e = *--S->top; // 栈顶指针先下移,后赋值
    return *e;
}
// 销毁栈,释放栈空间,栈顶栈底指针置为NULL,长度置为0
Status DestroyStack(SqStack *S) {
    free(S->base);
    S->base = S->top = NULL;
    S->stack_size = 0;
	printf("栈已成功销毁!\n");
    return 1;
}
// 遍历栈,依次打印每个元素
Status StackTraverse(SqStack *S) {
    ElemType *p;
    if (S->top == S->base) {
        printf("Stack is NULL.\n");
        return 0;
    }
    p = S->top;
    // 由栈顶依次向下遍历
	printf("栈顶到栈低元素依次为:");
    while (p > S->base) {
        p--;
        printf("%d ", *p);
    }
    printf("\n");
    return 1;
}
Status Create(SqStack *S)
{
	int n,e,i;
	printf("初始化栈S......\n");
    InitStack(S);
	printf("成功初始化\n");
    printf("输入栈的长度 :");
    scanf("%d", &n);
    for (i = 1; i <= n; i++) {
		printf("请输入第%d个元素:",i);
        scanf("%d", &e);
        PushStack(S, e);
    }
    printf("栈为空吗?\n");

    if (EmptyStack(S)) {
        printf("Yes!\n");
    } else {
        printf("No!\n");
    }
	return 1;
}
void menu()
{
   printf("==========================顺序栈的算法实现==========================\n");
   printf("**********************1.创建新栈     2.遍历栈**********************\n");
   printf("**********************3.取栈顶       4.销毁栈**********************\n");
   printf("**********************5.取栈长度     0.退出**********************\n");
}

void main() {
    SqStack q, *S;
    S = &q;
    int i, n;
	int choice;
    InitStack(S);
	while(1)
 {
  menu();
  printf("请输入菜单序号:\n");
  scanf("%d",&choice);
  if(choice==0) break;
  switch(choice)
  {
  case 1: Create(S);break;
  case 2:StackTraverse(S);break;
  case 3: GetTopStack(S);break;
  case 4:DestroyStack(S);break;
  case 5:LengthStack(S);break;
  default:printf("输入错误!!!\n");
  }
  system("pause");
}
}

你可能感兴趣的:(数据结构,数据结构,栈,c语言)