【数据结构】顺序结构实现栈

时间:2022-02-06 12:34:24

1.相関概念

栈:一种特殊的线性表,其只允许在在固定的一端进行插入和删除元素操作。

在对数据进行插入和删除操作的一端称为栈顶,另一端则称为栈底。不含任何元素的栈称为空栈,栈又称为后进先出的线性表。

栈的特点:后进先出(LIFO)

2.顺序结构实现栈

代码如下:

  • stack.h
//顺序结构实现栈
#ifndef __STACK_H__
#define __STACK_H__

#include <iostream>
#include <assert.h>
#include <stdlib.h>
using namespace std;

#define STACK_DEFAULT_SIZE 10 //栈默认大小

typedef int ElemType;

typedef struct Stack
{
ElemType* base;
int top;
int capacity;
}Stack;

void menu(); //菜单
void InitStack(Stack* s); //初始化栈
bool IsFull(Stack* s); //判断栈是否已满
bool IsEmpty(Stack* s); //判断栈是否为空
bool Push(Stack* s, ElemType x); //入栈
bool Pop(Stack* s, ElemType* x); //出栈
int Lenth(Stack* s); //求栈长
bool GetTop(Stack* s, ElemType *x); //获取栈顶元素
void ShowStack(Stack* s); //打印链表内容
void Clear(Stack* s); //清空栈
void Destroy(Stack* s); //销毁栈

#endif //__STACK_H__
  • stack.cpp
//顺序结构实现栈
#include "stack.h"

void menu() //菜单
{
cout << "*******************************************" << endl;
cout << "************* 【SeqStack】 **************" << endl;
cout << "*** [1]Push [2]Pop [3]lenth ***" << endl;
cout << "*** [4]GetTop [5]ShowStack [6]Clear ***" << endl;
cout << "************* 【HaHaHa】 **************" << endl;
cout << "*******************************************" << endl;
}

void InitStack(Stack* s) //初始化栈
{
ElemType* p = (ElemType*)malloc(sizeof(ElemType)* STACK_DEFAULT_SIZE);
assert(p != NULL);
s->base = p;
s->capacity = STACK_DEFAULT_SIZE;
s->top = 0;
}

bool IsFull(Stack* s) //判断栈是否已满
{
return s->top == s->capacity;
}

bool IsEmpty(Stack* s) //判断栈是否为空
{
return s->top == 0;
}

bool Push(Stack* s, ElemType x) //入栈
{
if (IsFull(s))
{
cout << "栈已满!" << endl;
return false;
}
s->base[s->top++] = x;
return true;
}

bool Pop(Stack* s, ElemType* x) //出栈
{
if (IsEmpty(s))
{
cout << "栈为空!" << endl;
return false;
}
*x = s->base[--s->top];
return true;
}

int Lenth(Stack* s) //求栈长
{
return s->top;
}

bool GetTop(Stack* s, ElemType *x) //获取栈顶元素
{
if (IsEmpty(s))
{
cout << "栈为空!" << endl;
return false;
}
*x = s->base[--s->top];
return true;
}

void ShowStack(Stack* s) //打印链表内容
{
int i = 0;
for (i = s->top - 1; i >= 0; --i)
{
cout << s->base[i] << "—>";
}
cout << "NULL" << endl;
}

void Clear(Stack* s) //清空栈
{
s->top = 0;
s->capacity = 0;
}

void Destroy(Stack* s) //销毁栈
{
Clear(s);
free(s->base);
s->base = NULL;
}
  • main.cpp
//顺序结构实现栈
#include "stack.h"

int main()
{
Stack s;
ElemType item;
int select = 1;
InitStack(&s);
while (select)
{
menu();
cout << "请选择: " << endl;
cin >> select;
switch (select)
{
case 1:
cout << "请输入: ";
while (cin >> item, item != -1)
{
Push(&s, item);
}
break;
case 2:
Pop(&s, &item);
cout << item << endl;
break;
case 3:
cout << "栈长为: " << Lenth(&s) << endl;
break;
case 4:
GetTop(&s, &item);
cout << "栈顶元素为: " << item << endl;
break;
case 5:
ShowStack(&s);
break;
case 6:
Clear(&s);
break;
default:
break;
}
}
Destroy(&s);
return 0;
}

这样,顺序结构实现栈就ok了。

宝宝们,可以参考一下,还请指点。