C语言-顺序栈的实现

本文通过实验详细介绍了顺序栈的基本概念、特点及其实现过程。使用C++语言,从创建顺序栈到实现数据的入栈和出栈运算,验证了栈的先进后出特性。实验包括编写入栈和出栈函数,并在主函数中调用这些函数进行数据处理。
摘要由CSDN通过智能技术生成

顺序栈

1.实验目的

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

2.实验内容

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

  1. 创建入栈和出栈函数;
  2. 在主函数中输入数据,以“\0”做结束标志,调用入栈和出栈函数。
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在接收字符时接收到“\n”
//E[i]=="\0"时结束
    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("\n*************\n1.入栈\n2.出栈\n0.退出\n*************\n>>>");
}

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

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

//出栈
void Pop(SqStack &S,char &e)
{
 if(S.top == S.base)
  printf("栈空!\n");
 else
 {
  e = *--S.top;
  printf("%c出栈成功!\n",e);
 }
}
5.总结
  1. 栈是“先进后出”。
  2. 顺序栈在栈顶进行操做。
  3. 栈满的标志是top-base == size。
  4. 栈是有限制的顺序表。注意取值与取址的适用情况。
顺序栈是一种基于数组实现,它的特点是具有随机存取的特性。顺序栈的基本运算包括进出栈和查看顶元素。进操作将元素插入到顶,出栈操作将顶元素删除并返回,查看顶元素操作返回顶的元素值,但不修改的状态。 在C语言中,顺序栈的存储结构可以使用一个一维数组来存放中的元素,同时使用一个指示器top来指示顶的位置。在进行进出栈操作时,需要更新top的值,使其指向顶元素。 下面是一种常见的顺序栈的定义和基本操作的示例代码: ```c // 定义中元素的数据类型 typedef int StackElementType; // 定义顺序栈的存储结构 #define Stack_Size 100 // 的最大容量 typedef struct { StackElementType elem[Stack_Size]; // 用数组存放中元素 int top; // 顶指针 } SeqStack; // 初始化顺序栈 void Init_SeqStack(SeqStack *S) { S->top = -1; // 初始时为空,顶指针置为-1 } // 进操作 void Push_SeqStack(SeqStack *S, StackElementType x) { if (S->top == Stack_Size - 1) { printf("已满,无法进"); return; } S->top++; // 顶指针加1 S->elem[S->top] = x; // 将新元素放入栈顶位置 } // 出栈操作 StackElementType Pop_SeqStack(SeqStack *S) { if (S->top == -1) { printf("为空,无法出栈"); return -1; // 返回一个特殊值表示出错 } StackElementType x = S->elem[S->top]; // 获取顶元素的值 S->top--; // 顶指针减1 return x; // 返回顶元素的值 } // 查看顶元素 StackElementType GetTop_SeqStack(SeqStack *S) { if (S->top == -1) { printf("为空"); return -1; // 返回一个特殊值表示出错 } return S->elem[S->top]; // 返回顶元素的值 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值