首页 > 其他分享 >北林OJ_243

北林OJ_243

时间:2023-10-20 23:35:49浏览次数:29  
标签:return OJ int ElemType top 北林 base 243 Stack

#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define MaxSize 100
typedef int ElemType;
//定义栈_顺序栈
struct Stack
{
	ElemType* top;
	ElemType* base;
	int stacksize;
};
int IsFull(Stack s);
int IsEmpty(Stack s);
//初始化
int InitStack(Stack& s)
{
	s.base = new ElemType[MaxSize];
	if (!s.base)
		return ERROR;
	s.top = s.base;
	s.stacksize = MaxSize;
	return OK;
}
//入栈
int PushbackStack(Stack& s, ElemType e)
{
	//判断栈是否满
	if (IsFull(s))
		return ERROR;
	*(s.top) = e;//error
	s.top++;
	return OK;
}
//出栈
int Popback(Stack& s, ElemType& e)
{
	//判断栈是否空
	if (IsEmpty(s))
		return ERROR;
	s.top--;
	return OK;
}
//判满
int IsFull(Stack s)
{
	if (s.top - s.base == s.stacksize)
		return 1;
	return 0;
}
//判空
int IsEmpty(Stack s)
{
	if (s.base == s.top)
		return 1;
	return 0;
}
//获取栈顶元素
ElemType StackTop(Stack s)
{
	//判断栈是否空
	if (IsEmpty(s))
		return ERROR;
	return *(s.top - 1);
}
//清除栈
int ClearStack(Stack& s)
{
	s.top = s.base;
	return OK;
}

int Destroy(Stack& s)
{
	delete s.base;
	s.top = s.base = NULL;
	return OK;
}
//构造栈——并按要求输出
int CreateStack(Stack& s, int n)
{
	InitStack(s);
	ElemType e;
	for (int i = 0; i < n; i++)
	{
		cin >> e;
		if (e == -1)
		{
			ElemType tmp = StackTop(s);
			if (!tmp)
			{
				cout << "POP ERROR" << endl;
				break;
			}
			else//输出栈顶元素并将其出栈
			{
				Popback(s, tmp);
				cout << tmp << endl;

			}
			continue;
		}
		//进栈
		PushbackStack(s, e);

	}
	return OK;
}

//输入一个整数序列a1,a2,a3...,an。当ai不等于-1时将ai进栈
//对于每一组数据输出若干行。每行为相应的出栈元素。当出栈异常时,输出“POP ERROR”并结束本组数据的输出。
void test1()
{
	Stack s;
	int n = 0;
	while (1)
	{
		cin >> n;
		if (n == 0)
			return;
		CreateStack(s, n);
		Destroy(s);
		
	}
	return;
}
int main()
{
	test1();
	return 0;
}

上面的代码有错误,在读入第二组数据之后,n的值为2,不是预期中的0

这是因为再从缓冲中读取第二组数是,遇到两个-1后跳出循环,而第二组数据剩下的2 2还留在缓冲区中,于是再次读取时,n=2

改正方法:

1.将缓冲区的数强制入栈,不让其停留在缓冲区,这样虽可以解决上述问题,但是不符合题目要求,因为如果输入的是:

7

1 2 -1 -1 -1 2 -1

那么输出:1 2  2,预期输入:1 2

其代码如下

//构造栈——并按要求输出
int CreateStack(Stack& s, int n)
{
	InitStack(s);
	ElemType e;
	for (int i = 0; i < n; i++)
	{
		cin >> e;
		if (e == -1)
		{
			ElemType tmp = StackTop(s);
			if (!tmp)
			{
				cout << "POP ERROR" << endl;
				//std::flush 是C++标准库 中的一个操作符,用于刷新输出流。
				//刷新输出流表示将缓冲区中的数据立即发送到关联的输出设备(例如屏幕或文件)
				cout << flush;//刷新缓冲区
				//break;
			}
			else//输出栈顶元素并将其出栈
			{
				Popback(s, tmp);
				cout << tmp << endl;

			}
			continue;
		}
		//进栈
		PushbackStack(s, e);

	}
	return OK;
}

//输入一个整数序列a1,a2,a3...,an。当ai不等于-1时将ai进栈
//对于每一组数据输出若干行。每行为相应的出栈元素。当出栈异常时,输出“POP ERROR”并结束本组数据的输出。
void test1()
{
	Stack s;
	int n = 0;
	while (1)
	{
		cin >> n;
		if (n == 0)
			return;
		CreateStack(s, n);
		Destroy(s);
		
	}
	return;
}

改正方法2:设置一个标志变量,当读入元素为-1且栈空后,将后面的元素继续入栈,但是不进行判断处理


//构造栈——并按要求输出
int CreateStack(Stack& s, int n)
{
	int flag = 1;
	InitStack(s);
	ElemType e;
	for (int i = 0; i < n; i++)
	{
		cin >> e;
		if (e == -1&&flag!=0)
		{
			ElemType tmp = StackTop(s);
			if (!tmp)
			{
				cout << "POP ERROR" << endl;
				flag = 0;
				continue;
				//break;
			}
			else//输出栈顶元素并将其出栈
			{
				Popback(s, tmp);
				cout << tmp << endl;
 
			}
			continue;
		}
		//进栈
		PushbackStack(s, e);
 
	}
	return OK;
}

改进方法3:将输入的数存入数组,从数组中读取数据

	//构造栈——并按要求输出
int CreateStack(Stack& s, int n)
{
	//int flag = 1;
	InitStack(s);
	ElemType arr[MaxSize];
	for (int i = 0; i < n; i++)
	{
		cin >> arr[i];
	}
	int i = 0;
	while(i<n)
	{
		if (arr[i] == -1)
		{
			ElemType tmp = StackTop(s);
			if (!tmp)
			{
				cout << "POP ERROR" << endl;
				cout << flush;
				//flag = 0;
				//continue;
				break;
			}
			else//输出栈顶元素并将其出栈
			{
				Popback(s, tmp);
				cout << tmp << endl;
 
			}
			i++;
			continue;
		}
		//进栈
		PushbackStack(s, arr[i]);
		i++;
 
	}
	return OK;
}

标签:return,OJ,int,ElemType,top,北林,base,243,Stack
From: https://blog.51cto.com/u_15805257/7960151

相关文章

  • Mojo——会燃的 AI 编程语言
    点击链接了解详情导语:本文简介Mojo的背景与特点,并分享如何通过腾讯云Cloudstudio的WebIDE和分享社区快速学习和上手Mojo。......
  • Flutter开发--新建项目中4种Project Type区别
     Projectflutter项目,里面有iOS、Android目录Moduleflutter模块,原生iOS项目,想加flutter功能开发Pluginflutter插件,原生flutter项目,想加iOS功能开发Package纯flutter项目,没有iOS、Android目录 https://www.jianshu.com/p/01972bf7cb97......
  • Chromium Mojo通信
    Mojo 是一个跨平台IPC框架,它诞生于chromium,用来实现chromium进程内/进程间的通信。目前,它也被用于ChromeOS。在我们代码应用中,如何使用Mojo来作进程间的通信呢,下面就手把手教你怎么使用Mojo!1. 初始化Mojo初始化Mojo有两种方式,一种适用于静态链接Mojo的程序,一种适用于......
  • [LOJ3626/QOJ4889] 愚蠢的在线法官
    考虑这个矩阵长啥样,首先显然\(A\)不能重复否则答案是\(0\)(有两行两列相同)。把\(A\)重标号为DFS序的顺序,那么行列式的值不改变,因为交换\(A_i,A_j\)相当于同时交换两行两列。考虑把权值\(v\)做树上差分,令\(B_u=v_u-v_{fa(u)}\),那么就等价于对每个\(i\)把\(i\)子树......
  • 【脚本】GuctOJ Helper 发布页
    我不会弄自动更新啊,OJ更新了记得来这里再复制一下代码GutcOJHelper基于油猴,不知道什么是油猴请自行百度适配GuctOJ3.x和2.0版本。网址:https://oj.oimaster.top经由NFLSOJHelper改编而来。NFLSOJHelper发布页:http://www.nfls.com.cn:20035/article/1197更新日志:h......
  • csproj文件
    参考Reference引用某个程序集PackageReference引用某个NuGet包ProjectReference引用某个项目Compile常规的C#编译None没啥特别的编译选项,就为了执行一些通用的操作(或者是只是为了在VisualStudio列表中能够有一个显示)Folder一个空的文件夹,也没啥用(不过标了这......
  • 浅析POJO、DTO、DO、VO、BO、PO、Entity
    名词解释领域模型中的实体类分为四种模型:VO、DTO、DO和PO,各种实体类用于不同业务层次间的交互,并会在层次内实现实体类之间的转化。新项目使用了新的框架和开发规范,特意集体讨论了DTO,DO,VO,BO,POJO,PO和Entity以及DAO、Model和View的基本概念和使用场景,为了深入理解,这里整理为一篇笔记......
  • 「BZOJ2505」tickets 题解
    preface网上目前还没看到我的方法,就大概讲一下做法solution首先想到贪心,考虑\([l,r]\)的最大次数,一定是找到最小的\(x\)满足\(l\simx\)的位数的和大于等于\(k\),然后递归的求解\([x+1,r]\),易证。还是考虑将\(Query(l,r)\)拆分成\(Query(1,r)\)和\(Query......
  • 北林OJ基于栈的后缀表达式求值
    思路1:(较易理解)#include<iostream>#include<iomanip>usingnamespacestd;#defineOK1#defineERROR0#defineMaxSize100typedefdoubleElemType;//定义栈_顺序栈structStack{ ElemType*top; ElemType*base; intstacksize;};intIsFull(Stacks);i......
  • 2023年10月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojs
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......