顺序栈 顺序栈是用顺序存储结构实现的栈,即利用一组地址连续的存储单元 依次存放自栈底到栈顶的数据元素,同时由于栈操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置置。通常以top=-1表示空栈。
该程序的功能有:
printf("======Belongs to CLC======\n");
printf("======1.建立并初始化栈======\n");
printf("======2.向栈进行入栈操作======\n");
printf("======3.将栈中的数据输出======\n");
printf("======4.对栈进行Pop操作======\n");
printf("======5.获取栈的长度======\n");
printf("======6.清空顺序栈======\n");
printf("======0.退出程序======\n");
关于程序的前定义:------(详情看代码解析)
#define SIZE 100//栈的最大容量
typedef int ElemType;//定义的抽象数据类型
typedef int CLC;//为方便以下的使用
对于顺序栈的定义:------(详情看代码解析)
typedef struct SqStack {
ElemType* elem;//用来存储数据的
int top_0;//实际数据存在时的顶部,初始值为:-1
int top_1;//这是栈容量的最高点,顶部
}SqStack;//运用SqStack作为域名(自己习惯说域名)
栈的初始化:
定义好一个栈后,我们需要对栈进行初始化:------(详情看代码解析)
CLC InitStack(SqStack* S) {
S->elem =(int *) malloc(SIZE * sizeof(ElemType));//为elem争取动态空间
S->top_0 = -1;//设置没有数据时栈的顶部位置为-1
S->top_1 = SIZE;//设置栈的最大容量为100
return true;
}//初始化
栈的传参数:CLC Push(SqStack* S)------(详情看代码解析)
CLC Push(SqStack* S) {
if (S->top_0 + 1 == SIZE) {
printf("栈已满了,无法进栈,如栈程序退出!!!\n");
return false;
}//判断栈是否为满,满的话就终止此函数
printf("请输入你要入栈的数据个数:");
int Num;
scanf_s("%d", &Num);//由于输入数据的个数不能超过SIZE,所以在for循环中就添加了限定语句
for (int i = 0; i < Num || i < SIZE; i++) {
scanf_s("%d", & S->elem[i]);
S->top_0 = i;
}//依次向栈由下至上赋值
return true;
}
栈的输出:Display(SqStack* S)?------(详情看代码解析)
判断栈是否为空的方法,也就是查看栈的栈顶是否为-1(一开始我们将栈顶top_0=-1),如果是-1,则这个栈就是空的,否则则反。
CLC Display(SqStack* S) {
if (S->top_0 ==-1 ) {
printf("栈为空,无法输出,程序退出!!!\n");
return false;
}//判断表格是否空,空则终止程序
for (int i = S->top_0; i >= 0; i--) {
printf("%d ", S->elem[i]);
}//依次从栈顶将数据输出
return true;
}//栈的输出
栈的Pop操作:CLC POP(SqStack* S)??------(详情看代码解析)
CLC POP(SqStack* S) {
if (S->top_0 == -1) {
printf("栈为空,程序退出!!\n");
return false;
}//判断栈是否为空,空则终止函数
printf("Pop掉最高点的数据%d\n", S->elem[S->top_0]);
S->top_0--;//从栈顶开始Pop
return true;
}//栈的Pop操作
其中栈的长度是很好求的,直接在main()中使用对象.top_0+1就可以获得栈的长度了
对于清空栈,就相当于重新初始化这个栈就可以了,初始化后他的栈顶就等于-1.
main()函数主体代码:------(详情看代码中的解析)
int main()
{
int i;
string answer;
SqStack S;//使用定义中的SqStack来定义对象 S
while (true) {
start:
printf("======请输入数字进行操作:======\n");
printf("======1.建立并初始化栈======\n");
printf("======2.向栈进行入栈操作======\n");
printf("======3.将栈中的数据输出======\n");
printf("======4.对栈进行Pop操作======\n");
printf("======5.获取栈的长度======\n");
printf("======6.清空顺序栈======\n");
printf("======0.退出程序======\n");
scanf_s("%d", &i);
switch (i) {
case 1:
InitStack(&S);//调用函数使栈初始化
printf("\n建立并初始化栈完毕!!\n");
system("pause");//代码停止作用
system("cls");//程序清屏作用
goto start;//回到start的位置
case 2:
Push(&S);调用函数Push来给栈存入数据
printf("进栈完毕!!\n");
system("pause");
system("cls");
goto start;
case 3:
Display(&S);调用函数来将栈中的数据打印出来
system("pause");
system("cls");
goto start;
case 4:
POP(&S);//调用POP函数来进行栈的Pop操作
printf("进行POP程序完成!!!\n");
system("pause");
system("cls");
goto start;
case 5:
printf("栈的长度为:%d", S.top_0 + 1);//直接将栈顶的值+1来实现长度
system("pause");
system("cls");
goto start;
case 6:
InitStack(&S);//调用初始化函数来将栈进行清空
printf("清空栈完毕!!\n");
system("pause");
system("cls");
goto start;
case 0://退出整个程序的代码
printf("确定退出程序吗?(yes or no):");
cin >> answer;
if (answer == "yes" || answer == "YES")exit(0);
if (answer == "no" || answer == "NO") {
system("pause");
system("cls");
goto start;
}
}
}
return 0;
}
完整代码如下:
#include<iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
#define SIZE 100//栈的最大容量
typedef int ElemType;//定义的抽象数据类型
typedef int CLC;//为方便以下的使用
typedef struct SqStack {
ElemType* elem;//用来存储数据的
int top_0;//实际数据存在时的顶部,初始值为:-1
int top_1;//这是栈容量的最高点,顶部
}SqStack;//运用SqStack作为域名(自己习惯说域名)
CLC InitStack(SqStack* S) {
S->elem = (int*)malloc(SIZE * sizeof(ElemType));//为elem争取动态空间
S->top_0 = -1;//设置没有数据时栈的顶部位置为-1
S->top_1 = SIZE;//设置栈的最大容量为100
return true;
}//初始化
CLC Push(SqStack* S) {
if (S->top_0 + 1 == SIZE) {
printf("栈已满了,无法进栈,如栈程序退出!!!\n");
return false;
}//判断栈是否为满,满的话就终止此函数
printf("请输入你要入栈的数据个数:");
int Num;
scanf_s("%d", &Num);//由于输入数据的个数不能超过SIZE,所以在for循环中就添加了限定语句
for (int i = 0; i < Num && i < SIZE; i++) {
scanf_s("%d", &S->elem[i]);
S->top_0 = i;
}//依次向栈由下至上赋值
return true;
}//Push赋值操作
CLC Display(SqStack* S) {
if (S->top_0 == -1) {
printf("栈为空,无法输出,程序退出!!!\n");
return false;
}//判断表格是否空,空则终止程序
for (int i = S->top_0; i >= 0; i--) {
printf("%d ", S->elem[i]);
}//依次从栈顶将数据输出
return true;
}//栈的输出
CLC POP(SqStack* S) {
if (S->top_0 == -1) {
printf("栈为空,程序退出!!\n");
return false;
}//判断栈是否为空,空则终止函数
printf("Pop掉最高点的数据%d\n", S->elem[S->top_0]);
S->top_0--;//从栈顶开始Pop
return true;
}//栈的Pop操作
int main()
{
int i;
string answer;
SqStack S;//使用定义中的SqStack来定义对象 S
while (true) {
start:
printf("======Belongs to CLC======\n");
printf("======1.建立并初始化栈======\n");
printf("======2.向栈进行入栈操作======\n");
printf("======3.将栈中的数据输出======\n");
printf("======4.对栈进行Pop操作======\n");
printf("======5.获取栈的长度======\n");
printf("======6.清空顺序栈======\n");
printf("======0.退出程序======\n");
printf("请输入数字进行操作:\n");
scanf_s("%d", &i);
switch (i) {
case 1:
InitStack(&S);//调用函数使栈初始化
printf("建立并初始化栈完毕!!\n");
system("pause");//代码停止作用
system("cls");//程序清屏作用
goto start;//回到start的位置
case 2:
Push(&S); //调用函数Push来给栈存入数据
printf("进栈完毕!!\n");
system("pause");
system("cls");
goto start;
case 3:
Display(&S); //调用函数来将栈中的数据打印出来
printf("\n输出数据完毕!!\n");
system("pause");
system("cls");
goto start;
case 4:
POP(&S);//调用POP函数来进行栈的Pop操作
printf("进行POP程序完成!!!\n");
system("pause");
system("cls");
goto start;
case 5:
printf("栈的长度为:%d\n", S.top_0 + 1);//直接将栈顶的值+1来实现长度
system("pause");
system("cls");
goto start;
case 6:
InitStack(&S);//调用初始化函数来将栈进行清空
printf("清空栈完毕!!\n");
system("pause");
system("cls");
goto start;
case 0://退出整个程序的代码
printf("确定退出程序吗?(yes or no):");
cin >> answer;
if (answer == "yes" || answer == "YES")exit(0);
if (answer == "no" || answer == "NO") {
system("pause");
system("cls");
goto start;
}
else {
printf("输入指令有误,程序继续!!\n");
system("pause");
system("cls");
goto start;
}
}
}
return 0;
}
版权属于作者 New Bull? ? ? ?未经允许不可转载,否者将追究版权问题
|