#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; typedef int Status; #define OVERFLOW -2 #define ERROR 0 #define OK 1 #define MAXSIZE 100 typedef struct { int *base; int *top; int stacksize; }SqStack; /**栈的创建和初始化**/ Status InitStack(SqStack *s) { s->base=(int *)malloc(sizeof(int)); if(!s->base) exit(OVERFLOW); s->stacksize=MAXSIZE; s->top=s->base; return OK; } /**入栈**/ Status Push(SqStack *s,int e) { if(s->top-s->base==s->stacksize) return ERROR;//栈满 *(s->top)++=e; return OK; } /**出栈**/ Status pop(SqStack *s,int *e) { if(s->base==s->top) return ERROR; *e=*--s->top; return OK; } int main() { SqStack s,s1; int a,i,b,c,d; printf("创建栈\n"); if(!InitStack(&s)) printf("创建失败\n\n"); else printf("创建成功\n\n"); printf("给栈内填充数据\n"); printf("输入栈内的数据个数:"); cin>>a; printf("输入数据:\n"); for(i=0;i<a;i++) { cin>>b; if(!Push(&s,b)) printf("栈满\n"); } if(!InitStack(&s1)) printf("创建栈失败\n\n"); printf("栈按顺序输出为:\n"); for(i=0;i<a;i++) { if(!pop(&s,&d)) printf("栈空\n"); else { printf("%d ",d); if(!Push(&s1,d)) printf("栈满\n\n"); } } printf("\n"); printf("栈逆序输出为:\n"); for(i=0;i<a;i++) { if(!pop(&s1,&d)) printf("栈空\n"); else printf("%d ",d); } printf("\n"); system("pause"); return 0; }
时间: 2024-02-04 17:02:57 浏览: 51
这是一个使用C++语言实现的栈的基本操作代码,包括栈的创建和初始化,入栈,出栈等操作。其中栈的结构体定义了栈底指针base,栈顶指针top和栈的大小stacksize。函数InitStack用来创建并初始化栈,函数Push用来实现入栈操作,函数pop用来实现出栈操作。在主函数中,先创建一个栈s,然后通过用户输入给栈内填充数据,再创建一个栈s1,将栈s中的数据按顺序依次弹出并压入栈s1中,最后将栈s1中的数据逆序输出。
相关问题
解释代码(#include<stdio.h> #include<string.h> #include<malloc.h> #include <stdlib.h> #include<iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int Boolean; typedef char TElemType; #define MaxInt 32767 #define MVNum 100 typedef char VerTexType; typedef int ArcType; typedef struct { VerTexType vex[MVNum];//顶点表 ArcType arcs[MVNum][MVNum];//邻接矩阵 int vexnum,arcnum;//图的当前点数和边数 }AMGraph; struct { VerTexType Head;//边的始点 VerTexType Tail;//边的终点 ArcType lowcost;//边上的权值 }Edge[MVNum]; int LocateVex(AMGraph &G,VerTexType u) {//存在则返回u在顶点表中的下标;否则返回-1 int i; for(i=0;i<G.vexnum;++i) if(u==G.vex[i]) return i; //return -1; } Status CreatUDN(AMGraph &G)//创建图 { printf("请输入顶点和边数:\n"); cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:\n"; for(int i=0;i<G.vexnum;i++) cin>>G.vex[i]; for(int i=0;i<G.vexnum;i++) { for(int j=0;j<G.vexnum;j++) G.arcs[i][j]=MaxInt; })
这段代码是关于图的邻接矩阵存储结构的实现。包含了一些头文件和宏定义。其中,typedef用于定义新的数据类型,Status和Boolean都是int类型的,TElemType是char类型的,分别用于表示状态、布尔值和图中节点的数据类型。宏定义中,TRUE和FALSE分别表示1和0,OK和ERROR分别表示操作成功和失败,OVERFLOW表示溢出。AMGraph结构体包含了图的顶点表和邻接矩阵,以及当前点数和边数。Edge数组存储了边的始点、终点和权值。LocateVex函数用于查找节点在顶点表中的下标,如果不存在则返回-1。CreatUDN函数用于创建无向图,首先输入顶点和边数,然后输入每个节点的数据,初始化邻接矩阵的值为MaxInt表示没有边相连。
函数接口定义: void CreateUDG(AMGraph &G); //创建图,采用邻接矩阵存储 int DFS(AMGraph G, int v);//以v为起点深度优先遍历,求出各顶点值的和作为函数返回值 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MVNum 100 int visited[MVNum]; typedef struct{ int vexs[MVNum]; //顶点向量,各小岛对应积分
好的,根据您提供的函数接口定义,我给出以下代码示例供参考:
```c++
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
#define MVNum 100
// 邻接矩阵存储的图结构体
typedef struct {
int vexs[MVNum]; // 顶点向量,各小岛对应积分
int arcs[MVNum][MVNum]; // 邻接矩阵,记录各小岛之间的连通情况
int vexnum, arcnum; // 顶点数和边数
} AMGraph;
// 创建图,采用邻接矩阵存储
void CreateUDG(AMGraph& G) {
cout << "请输入小岛数和边数:";
cin >> G.vexnum >> G.arcnum;
cout << "请输入各小岛对应积分:";
for (int i = 0; i < G.vexnum; i++) {
cin >> G.vexs[i];
}
// 初始化邻接矩阵
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
G.arcs[i][j] = 0;
}
}
// 建立边
cout << "请输入各边的起点和终点:";
int v1, v2;
for (int i = 0; i < G.arcnum; i++) {
cin >> v1 >> v2;
G.arcs[v1][v2] = 1;
G.arcs[v2][v1] = 1;
}
}
// 以v为起点深度优先遍历,求出各顶点值的和作为函数返回值
int DFS(AMGraph G, int v) {
stack<int> s;
vector<int> path;
int sum = 0;
// 初始化visited数组
for (int i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
// 从起点开始遍历
s.push(v);
visited[v] = 1;
sum += G.vexs[v];
path.push_back(v);
while (!s.empty()) {
int cur = s.top();
int flag = 0;
for (int i = 0; i < G.vexnum; i++) {
if (G.arcs[cur][i] == 1 && visited[i] == 0) {
visited[i] = 1;
s.push(i);
sum += G.vexs[i];
path.push_back(i);
flag = 1;
break;
}
}
if (flag == 0) {
s.pop();
}
}
// 输出遍历路径
cout << "遍历路径为:";
for (int i = 0; i < path.size(); i++) {
cout << path[i] << " ";
}
cout << endl;
return sum;
}
int main() {
AMGraph G;
CreateUDG(G);
int sum = DFS(G, 0);
cout << "闯关成功者共获得 " << sum << " 积分" << endl;
return 0;
}
```
上述代码中,我们先定义了一个邻接矩阵存储的图结构体`AMGraph`,然后定义了`CreateUDG`和`DFS`两个函数,分别用于创建图和进行深度优先遍历计算积分。
在`DFS`函数中,我们使用了一个栈`s`来记录遍历路径,使用一个`path`列表来记录最终的遍历路径,使用一个`sum`变量来记录积分总和。我们首先将起点入栈,并将其对应的积分加入总和中,然后开始遍历。
在遍历过程中,首先取出栈顶元素,然后遍历该元素相邻的未访问过的岛屿,将其压入栈中,并将其对应的积分加入总和中。如果当前岛屿没有未访问过的相邻岛屿,说明该岛屿已经被完全遍历过了,我们将其从栈中弹出。
最后,我们将最终遍历路径输出,并返回积分总和。在`main`函数中,我们调用`CreateUDG`函数创建图,调用`DFS`函数进行深度优先遍历,并输出结果。
阅读全文