数据结构线性表 - 顺序栈练习Demo
通过对栈这个数据结构的学习加上自己对栈的理解,写了这个以顺序表作为栈的存储形式的顺序栈的练习Demo,已测试,没有什么问题。直接上代码。
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef struct {
char p;
}Elem;
typedef struct Stack{
Elem *elem;
int top;
}Stack;
void InitStack(Stack &S)
{
S.elem = new Elem[MAXSIZE];
if (!S.elem)
{
cout << "初始化失败!";
exit(-1);
}
else
S.top = -1;
cout << "初始化成功!";
}
int JudgeEmp(Stack &S)
{
if (S.top == -1)
{
return 1;
}
else
{
return 0;
}
}
void Push_All(Stack &S)
{
char p = NULL;
int k=0;
if (S.top == MAXSIZE - 1)
{
cout << "栈满,无法完成入栈操作";
}
else
cout << "请输入入栈数据:";
while (p != '#')
{
cin >> p;
if (p == '#')
{
return;
}
S.top++;
S.elem[k].p = p;
k++;
}
cout << "数据入栈完毕!";
}
void Print_Stack(Stack &S)
{
int k = S.top;
while (k != -1)
{
cout << S.elem[k].p;
k--;
}
}
void Push(Stack &S)
{
char a;
if (S.top == MAXSIZE - 1)
{
cout << "栈已满,无法入栈数据!";
}
else
cout << "请输入入栈的一个数据:";
cin >> a;
S.top++;
S.elem[S.top].p = a;
cout << "\n" << "数据入栈成功!";
}
void Pop_Point(Stack &S)
{
int k;
if (JudgeEmp(S))
{
cout << "栈空,无法弹出数据!";
return;
}
cout << "出栈几个数据:";
cin >> k;
for (int i = 0; i < k; i++)
{
cout << S.elem[S.top].p;
S.top--;
}
cout << "出栈成功!";
}
void Pop_One(Stack &S)
{
if (JudgeEmp(S))
{
cout << "栈空,无法弹出数据!";
return;
}
cout << S.elem[S.top].p << " " << "出栈!";
S.top--;
}
void Stack_Length(Stack &S)
{
cout << "一共有" << S.top + 1 << "个数据!";
}
void Contents() //菜单清单
{
cout << "***************************************\n";
cout << "* 顺 序 栈 练 习 *\n";
cout << "* *\n";
cout << "* 1.初始化顺序栈 *\n";
cout << "* 2.向顺序栈压入多个数据 *\n";
cout << "* 3.查看顺序栈的数据 *\n";
cout << "* 4.入栈一个数据 *\n";
cout << "* 5.出栈指定数量数据 *\n";
cout << "* 6.出栈一个数据(读栈顶元素) *\n";
cout << "* 7.顺序栈元素个数 *\n";
cout << "* 8.退出程序 *\n";
cout << "***************************************\n";
}
void main()
{
Stack S;
int a;
Contents();
while (1)
{
system("cls");
Contents();
cout << "请选择功能:";
cin >> a;
switch (a)
{
case 1: InitStack(S); system("PAUSE"); break;
case 2: Push_All(S); system("PAUSE"); break;
case 3: Print_Stack(S); system("PAUSE"); break;
case 4: Push(S); system("PAUSE"); break;
case 5: Pop_Point(S); system("PAUSE"); break;
case 6: Pop_One(S); system("PAUSE"); break;
case 7: Stack_Length(S); system("PAUSE"); break;
case 8: exit(-1);
default: cout<<"输入错误!请重新输入"; system("PAUSE"); break;
}
}
}
顺序栈是实现栈这种数据结构的一种方式,顺序栈实现起来比较简单,但是顺序栈和顺序表一样,数的存储空间是固定的
当栈满了以后就不能再入栈数据了,相对来说不灵活。
栈的逻辑特点是 先入后出 或者 后入先出 (LIFO)
栈所有的操作只能在栈顶进行
栈空判定条件:TOP == -1
栈满判定条件:TOP == MAXSIZE-1
栈的应用:括号匹配、表达式求值(计算器)、递归。。。