C语言-顺序栈的实现

顺序栈

1.实验目的

掌握栈的特点(先进后出)及其基本操作。如入栈、出栈等,栈的顺序存储结构和链式存储结构,以便在实际问题中灵活运用。

2.实验内容

创建一个顺序栈,实现数据的入栈和出栈运算,进而验证栈的先进后出的特性。步骤如下:

  1. 创建入栈和出栈函数;
  2. 在主函数中输入数据,以“”做结束标志,调用入栈和出栈函数。

3.实验工具

Visual C++

4.实验代码

如下:

//Authors:xiaobei

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct
{
 char *base;
 char *top;
 int stacksize;
}SqStack;

void InitStack(SqStack &S);    //S为结构体名,是首地址,用&来取址
void Push(SqStack &S,char e);
void Pop(SqStack &S,char &e);
void menu();

int main()
{
 SqStack stack_a;
 int i,user,n;
 char E[5],e;
 InitStack(stack_a);
 while(1)
 {
  menu();
  scanf("%d",&user);
  switch(user)
  {
  case 1:{
   printf("请输入入栈元素:");
   getchar();
   gets(E);
   for(i=0;i<5;i++)
   {
//scanf(" %c",&e);   
//%c前加空格,或者前用getchar(),防止scanf在接收字符时接收到“
”
//E[i]==""时结束
    if(E[i])
     Push(stack_a,E[i]);
    else
     break;
   }
      };break;
  case 2:{
   printf("请输入出栈元素个数:");
   scanf("%d",&n);
   for(i = 0;i<n;i++)
   {
    Pop(stack_a,e);
   };break;
      }
  case 0:exit(0);
  }
 }
 return 0;
}

//打印菜单
void menu()
{
 printf("
*************
1.入栈
2.出栈
0.退出
*************
>>>");
}

//栈的初始化
void InitStack(SqStack &S)
{
 S.base = (char*)malloc(5*sizeof(char));
 if(!S.base)
 {
  printf("内存分配失败!
");
  exit(0);
 }
 S.top = S.base;
 S.stacksize = 5;
 printf("内存分配成功!
");
}

//入栈
void Push(SqStack &S,char e)
{
 if(S.top - S.base == S.stacksize)
  printf("栈满!
");
 else
 {
  *S.top++ = e;
  printf("%c入栈成功!
",e);
 }
}

//出栈
void Pop(SqStack &S,char &e)
{
 if(S.top == S.base)
  printf("栈空!
");
 else
 {
  e = *--S.top;
  printf("%c出栈成功!
",e);
 }
}

5.总结

  1. 栈是“先进后出”。
  2. 顺序栈在栈顶进行操做。
  3. 栈满的标志是top-base == size。
  4. 栈是有限制的顺序表。注意取值与取址的适用情况。
原文地址:https://www.cnblogs.com/slz99/p/12527745.html