数据结构实验三 顺序栈之top=-1
#include <iostream>
#include "stdio.h"
#include "stdlib.h"
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
#define MaxSize 100 //定义栈中元素的最大个数
//栈顶指针:S.top,初始时设置S.top == -1,栈顶元素:S.data[S.top]
//栈空条件:S.top == -1
//栈满条件:S.top == MaxSize - 1
//栈长:S.top + 1(数组下标0也放了一个数据元素,故元素个数为top+1)
//00定义栈的数据结构,数据元素---原子类型不用结构体,数据结构---两个域的结构体,静态存储方式
typedef int SElemType;
typedef struct {
SElemType data[MaxSize];//存放栈中元素
int top;//栈顶指针
}SqStack;
//01初始化
Status InitSqStack(SqStack &S);
//02 随机创建一个正整数值的栈(输入-1时创建结束)
Status CreateSqStack(SqStack &S);
//03入栈
Status Push(SqStack &S, SElemType e);
//04出栈
Status Pop(SqStack &S, SElemType &e);
//05读栈顶元素
Status GetTop(SqStack S, SElemType &e);
//06 输出从栈底到栈顶的所有元素
Status TraverseSqStack(SqStack S);
//07判栈空
bool StackEmpty(SqStack S);
//08求栈的长度
Status GetLength(SqStack S, int &len);
int main()
{
int k, len;
SqStack S;
SElemType x;
do {
cout << "\n=====================顺序栈的操作====================";
cout << "\n 1.初始化顺序栈";
cout << "\n 2.随机创建一个正整数值的栈(输入-1时创建结束)";
cout << "\n 3.将一个数x插在栈顶(x在程序运行时输入)";
cout << "\n 4.将栈顶元素弹出,并在弹出结束后输出弹出元素的值";
cout << "\n 5.输出栈顶元素的值";
cout << "\n 6.求栈的长度";
cout << "\n 7.输出从栈底到栈顶的所有元素";
cout << "\n 0.结束程序运行";
cout << "\n=====================================================";
cout << "\n 请输入您的选择(1,2,3,4,5,6,7,0)";
cin >> k;
switch (k)
{
case 1:
if (InitSqStack(S))
cout << "初始化成功!";
else
cout << "初始化失败!";
break;
case 2:
if (CreateSqStack(S))
{
cout << "创建成功!栈底至栈顶元素为:";
TraverseSqStack(S);
}
else
cout << "创建失败!";
break;
case 3:
cout << "请输入入栈元素的值x:";
cin >> x;
Push(S, x);
break;
case 4:
if (Pop(S, x))
cout << "栈顶弹出元素的值为:" << x << endl;;
break;
case 5:
if (GetTop(S, x))
cout << "栈顶元素的值为:" << x << endl;
break;
case 6:
if (GetLength(S, len))
cout << "当前顺序栈的长度为:" << len << endl;
break;
case 7:
cout << "栈底到栈顶的元素:";
TraverseSqStack(S);
break;
case 0:
break;
default:
cout << "无效选项,请重新输入!" << endl;
break;
}/*switch*/
} while (k != 0);
system("pause");
return 0;
}/*main*/
//01初始化
Status InitSqStack(SqStack &S) {
S.top = -1;//初始化栈顶指针
return OK;
}
//02 随机创建一个正整数值的栈(输入-1时创建结束)
Status CreateSqStack(SqStack &S)
{
if(S.top != -1)
S.top = -1;//创建的是新的,想当于初始化
SElemType e;
int i = 0;
cout << "请输入正整数栈元素(-1结束):";
cin >> e;
while (e!=-1&&i<MaxSize)
{
Push(S, e);
cin >> e;
i++;
}
scanf("%*[^\n]"); scanf("%*c");//吃掉输入多余数组空间的数据,并吃掉回车符;
return OK;
}
//03入栈
Status Push(SqStack &S, SElemType e) {
if (S.top == MaxSize - 1) {//栈满
return ERROR;
}
S.top++;//指针指向下一个位置
S.data[S.top] = e;//入栈
return OK;
}
//04出栈
Status Pop(SqStack &S, SElemType &e) {
if (S.top == -1) {//栈空
return ERROR;
}
e = S.data[S.top];//出栈
S.top--;//指针-1,往前挪一个
return OK;
}
//05读栈顶元素
Status GetTop(SqStack S, SElemType &e) {
if (S.top == -1) {//栈空
return ERROR;
}
e = S.data[S.top];
return OK;
}
//06 输出从栈底到栈顶的所有元素
Status TraverseSqStack(SqStack S)
{
if (S.top == -1)
{
cout << "当前为空栈!\n";
return ERROR;
}
for (int i = 0; i <= S.top;i++)
cout <<S.data[i]<< " "; //输出指针p指向的值并加1
cout << endl;
return OK;
}
//07判栈空
bool StackEmpty(SqStack S) {
if (S.top == -1) {
return true;
}
else {
return false;
}
}
//08求栈的长度
Status GetLength(SqStack S, int &len)//len的值要传递给实参,因此要&len,但S的值没变不用加&。
{
if (S.top == -1)
{
len=0;
}
len = S.top+1;//top是int,数组下标从0开始,故个数要+1.
return OK;
}

浙公网安备 33010602011771号