NX二次开发-重命名装配组件
在GC工具里面是有一个重命名装配组件的命令的,除了这个外,好像没看到NX里还有其他可以重命名装配组件的命令,本来以为在UFUN ASSEM装配的头文件里会有更改装配部件名字的函数,但是没有找到,可能没有。本来以为UF_ASSEM_rename_instance这个可以,后来发现还不行,这个只能改右键属性名字。
但是我找到了替换组件的函数,我觉得这个是可以实现功能的。后来我按照自己想到的思路,对照着GC工具就写了一下。
我的思路是这样的:一个单选对话框->选择装配组件->得到tag->由tag得到装配组件的part名字->把名字显示到一个字符串窗口->用户更改名字->copy本地那个装配组件.prt文件->把新名字命名给copy后的那个.prt文件->
然后用替换组件函数替换copy后的那个.prt文件->最后在把copy前那个旧的.prt文件删掉
//RenameComponent // Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h> // Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx> // Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx> #include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_curve.h>
#include <uf_assem.h>
#include <uf_obj.h>
#include <windows.h>
#include <stdarg.h>
#include <strstream>
#include <iostream>
#include <string>
#include <io.h> // Std C++ Includes
#include <iostream>
#include <sstream> using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr; //------------------------------------------------------------------------------
// NXOpen c++ test class
//------------------------------------------------------------------------------
class MyClass
{
// class members
public:
static Session *theSession;
static UI *theUI; MyClass();
~MyClass(); void do_it();
void print(const NXString &);
void print(const string &);
void print(const char*); int DelectValue;//对话框返回值,决定是否删除原组件
string NameOrPath(const char* Path, int Type);//返回.prt文件名字和所在文件夹路径
void filesearch(string path, int layer);//遍历文件夹所有.prt文件
char part_name[MAX_FSPEC_BUFSIZE];//当前显示部件.prt文件所在路径
char str[];//字符串输入对话框值 private:
Part *workPart, *displayPart;
NXMessageBox *mb;
ListingWindow *lw;
LogFile *lf;
}; //------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL; //------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
MyClass::MyClass()
{ // Initialize the NX Open C++ API environment
MyClass::theSession = NXOpen::Session::GetSession();
MyClass::theUI = UI::GetUI();
mb = theUI->NXMessageBox();
lw = theSession->ListingWindow();
lf = theSession->LogFile(); workPart = theSession->Parts()->Work();
displayPart = theSession->Parts()->Display(); } //------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
} //------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
} static int select_filter_proc_fn(tag_t object, int type[], void* user_data, UF_UI_selection_p_t select)
{
if (object == NULL)
{
return UF_UI_SEL_REJECT;
}
else
{
return UF_UI_SEL_ACCEPT;
}
} static int init_proc(UF_UI_selection_p_t select, void* user_data)
{
int num_triples = ;//可选类型的数量
UF_UI_mask_t mask_triples[] =
{ UF_component_type, UF_UI_SEL_NOT_A_FEATURE,
};//可选对象类型
UF_UI_set_sel_mask(select, UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, num_triples, mask_triples);
if ((UF_UI_set_sel_procs(select, select_filter_proc_fn, NULL, user_data)) == )
{
return UF_UI_SEL_SUCCESS;
}
else
{
return UF_UI_SEL_FAILURE;
}
} string MyClass::NameOrPath(const char* Path, int Type)
{
//反向找位置,分割字符串(只读取文件夹路径)
string strPath = Path;
string strDir;
int nPos = strPath.find_last_of('\\');
if (string::npos != nPos)
{
strDir = strPath.substr(, nPos);
} //分割字符串(只读取part名字+后缀)
//方法2
int pos = strPath.find_last_of('\\');
string s1(strPath.substr(pos + )); //分割字符串(只读取part名)
string PartName(s1.substr(, s1.find(".prt"))); if (Type == )
{
return PartName;//返回名字
}
else if (Type == )
{
return strDir;//返回文件夹路径
}
} void MyClass::filesearch(string path, int layer)
{
char msg[] = "";
char msgg[] = "";
struct _finddata_t filefind;
string f;
string curr = path + "\\*.*";
int done = , i, handle;
if ((handle = _findfirst(curr.c_str(), &filefind)) != -)
{
while (!(done = _findnext(handle, &filefind)))
{
if (strcmp(filefind.name, "..") == )
continue;
for (i = ; i < layer; i++)
printf("\t");
if ((_A_SUBDIR == filefind.attrib)) // 是目录
{
curr = path + "\\" + filefind.name;
sprintf(msg, "%s\n", curr.c_str());
//UF_UI_write_listing_window(msg);
filesearch(curr, layer + ); // 递归遍历子目录
}
else // 是文件
{ sprintf(msg, "%s", filefind.name);
if (strlen(msg) > )
{
strncpy(msgg, msg + strlen(msg) - , );
if (strcmp(msgg, ".prt") == ) // 文件格式
{
f = path + "\\" + filefind.name;
sprintf(msg, "%s\n", f.c_str());
//UF_UI_write_listing_window(msg); //分割字符串(只读取part名)
string PartName = NameOrPath(f.c_str(), );
string PartPath = NameOrPath(f.c_str(), ); //分割字符串(只读取part名)
string PartName1 = NameOrPath(part_name, ); //找到名字相同的.prt文件
if (PartName == PartName1)
{
//转换
char NewName1[];
sprintf(NewName1, "\\%s.prt", str);
string NewName2 = NewName1;
//字符串拼接
string NewName = PartPath + NewName2; //copy出一个新的.prt文件
CopyFile(f.c_str(), NewName.c_str(), FALSE); //由名字得到装配部件实例的TAG
tag_t instanceTAG = UF_ASSEM_ask_instance_of_name(UF_PART_ask_display_part(), part_name); //重新命名装配部件的part名称
UF_PART_load_status_t load_status;
UF_ASSEM_use_alternate(&instanceTAG, NewName.c_str(), str, str, &load_status); //由对话框值判断是否删除原组件
if (DelectValue == )
{
//删除旧名字的.prt文件
DeleteFile(f.c_str());
} } }
}
}
}
_findclose(handle);
}
} //------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{ // TODO: add your code here UF_initialize(); //单对象选择对话框
char sCue[] = "单对象选择对话框";
char sTitle[] = "选择一个装配组件";
int iScope = UF_UI_SEL_SCOPE_NO_CHANGE;
int iResponse;
tag_t tView;
double adCursor[];
tag_t ComponentTag = NULL_TAG;//单选控件获得的tag
UF_UI_select_with_single_dialog(sCue, sTitle, iScope, init_proc, NULL, &iResponse, &ComponentTag, adCursor, &tView); //获取装配部件的part名称
char refset_name[UF_OBJ_NAME_BUFSIZE];
char instance_name[UF_CFI_MAX_FILE_NAME_BUFSIZE];
double origin[];
double csys_matrix[];
double transform[][];
UF_ASSEM_ask_component_data(ComponentTag, part_name, refset_name, instance_name, origin, csys_matrix, transform); //输入字符串控件
char * cue = "输入框";
//转换
char str1[];
sprintf(str1, "%s", part_name);
//分割字符串(只读取part名)
string PartName1 = NameOrPath(str1, );
sprintf(str, "%s", PartName1.c_str());
int length = ;
uc1600(cue, str, &length); //弹出对话框
char sPromptStr1[] = "单选菜单对话框";
int iDefault1 = ;
char asOptions1[][] = { "删除原组件", "保留原组件" };
int iNumOfOptions1 = ;
DelectValue = uc1603(sPromptStr1, iDefault1, asOptions1, iNumOfOptions1); //获得当前显示部件.prt文件所在路径
char part_fspec[MAX_FSPEC_BUFSIZE];
UF_PART_ask_part_name(UF_PART_ask_display_part(), part_fspec); //获取文件夹路径
string strDir = NameOrPath(part_fspec, ); //遍历文件夹
filesearch(strDir, ); UF_terminate(); } //------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
// Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
try
{
// Create NXOpen C++ class instance
MyClass *theMyClass;
theMyClass = new MyClass();
theMyClass->do_it();
delete theMyClass;
}
catch (const NXException& e1)
{
UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
}
catch (const exception& e2)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
}
catch (...)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
}
} //------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
} Caesar卢尚宇
2019年8月12日
补充:
今天又写了第二种方法(2019年8月13日)
//NX9_NXOpenCPP_Wizard2 // Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h> // Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx> // Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx> #include <uf.h>
#include <uf_assem.h>
#include <uf_obj.h>
#include <uf_part.h>
#include <uf_modl.h>
#include <uf_ui.h>
#include <windows.h>
#include <uf_disp.h> // Std C++ Includes
#include <iostream>
#include <sstream> using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr; //------------------------------------------------------------------------------
// NXOpen c++ test class
//------------------------------------------------------------------------------
class MyClass
{
// class members
public:
static Session *theSession;
static UI *theUI; MyClass();
~MyClass(); void do_it();
void print(const NXString &);
void print(const string &);
void print(const char*); //单选
int DelectValue;//对话框返回值,决定是否删除原组件
string NameOrPath(const char* Path, int Type);//返回.prt文件名字和所在文件夹路径 private:
Part *workPart, *displayPart;
NXMessageBox *mb;
ListingWindow *lw;
LogFile *lf;
}; //------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL; //------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
MyClass::MyClass()
{ // Initialize the NX Open C++ API environment
MyClass::theSession = NXOpen::Session::GetSession();
MyClass::theUI = UI::GetUI();
mb = theUI->NXMessageBox();
lw = theSession->ListingWindow();
lf = theSession->LogFile(); workPart = theSession->Parts()->Work();
displayPart = theSession->Parts()->Display(); } //------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
} //------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
} static int select_filter_proc_fn(tag_t object, int type[], void* user_data, UF_UI_selection_p_t select)
{
if (object == NULL)
{
return UF_UI_SEL_REJECT;
}
else
{
return UF_UI_SEL_ACCEPT;
}
} static int init_proc(UF_UI_selection_p_t select, void* user_data)
{
int num_triples = ;//可选类型的数量
UF_UI_mask_t mask_triples[] =
{ UF_component_type, UF_UI_SEL_NOT_A_FEATURE,
};//可选对象类型
UF_UI_set_sel_mask(select, UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, num_triples, mask_triples);
if ((UF_UI_set_sel_procs(select, select_filter_proc_fn, NULL, user_data)) == )
{
return UF_UI_SEL_SUCCESS;
}
else
{
return UF_UI_SEL_FAILURE;
}
} string MyClass::NameOrPath(const char* Path, int Type)
{
//反向找位置,分割字符串(只读取文件夹路径)
string strPath = Path;
string strDir;
int nPos = strPath.find_last_of('\\');
if (string::npos != nPos)
{
strDir = strPath.substr(, nPos);
} //分割字符串(只读取part名字+后缀)
//方法2
int pos = strPath.find_last_of('\\');
string s1(strPath.substr(pos + )); //分割字符串(只读取part名)
string PartName(s1.substr(, s1.find(".prt"))); if (Type == )
{
return PartName;//返回名字
}
else if (Type == )
{
return strDir;//返回文件夹路径
}
} //------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{ // TODO: add your code here UF_initialize(); //单对象选择对话框
char sCue[] = "单对象选择对话框";
char sTitle[] = "选择一个装配组件";
int iScope = UF_UI_SEL_SCOPE_NO_CHANGE;
int iResponse;
tag_t tView;
double adCursor[];
tag_t ComponentTag = NULL_TAG;//单选控件获得的tag
UF_UI_select_with_single_dialog(sCue, sTitle, iScope, init_proc, NULL, &iResponse, &ComponentTag, adCursor, &tView); //获取装配部件的part名称
char part_name[MAX_FSPEC_BUFSIZE];//当前显示部件.prt文件所在路径
char refset_name[UF_OBJ_NAME_BUFSIZE];
char instance_name[UF_CFI_MAX_FILE_NAME_BUFSIZE];
double origin[];
double csys_matrix[];
double transform[][];
UF_ASSEM_ask_component_data(ComponentTag, part_name, refset_name, instance_name, origin, csys_matrix, transform); //输入字符串控件
char * cue = "输入框";
//转换
char str1[];
sprintf(str1, "%s", part_name);
//分割字符串(只读取part名)
string PartName1 = NameOrPath(str1, );
char str[];//字符串输入对话框值
sprintf(str, "%s", PartName1.c_str());
int length = ;
uc1600(cue, str, &length); //弹出对话框
char sPromptStr1[] = "单选菜单对话框";
int iDefault1 = ;
char asOptions1[][] = { "删除原组件", "保留原组件" };
int iNumOfOptions1 = ;
DelectValue = uc1603(sPromptStr1, iDefault1, asOptions1, iNumOfOptions1); //返回原型标识
tag_t ComponentPart = UF_ASSEM_ask_prototype_of_occ(ComponentTag); //设置为工作部件
UF_ASSEM_set_work_part(ComponentPart); //获得当前工作部件.prt文件所在路径
char part_fspec1[MAX_FSPEC_BUFSIZE];
UF_PART_ask_part_name(UF_ASSEM_ask_work_part(), part_fspec1); //重命名实例名称
UF_PART_rename(ComponentPart, str); //获得当前显示部件.prt文件所在路径
char part_fspec[MAX_FSPEC_BUFSIZE];
UF_PART_ask_part_name(UF_PART_ask_display_part(), part_fspec); //获取文件夹路径
string strDir = NameOrPath(part_fspec, ); //转换
char msg[];
sprintf_s(msg, "\\%s.prt", str);
string strDir1 = msg; //字符串拼接
string strDir2 = strDir + strDir1; //另存为改名后的.prt
UF_PART_save_as(strDir2.c_str()); //把显示部件设置为工作部件
UF_ASSEM_set_work_part(UF_PART_ask_display_part()); //部件清理,移除高亮
NXOpen::PartCleanup *partCleanup1;
partCleanup1 = theSession->NewPartCleanup();
partCleanup1->SetTurnOffHighlighting(true);
partCleanup1->DoCleanup(); //删除旧的.prt文件
if (DelectValue == )
{
DeleteFile(part_fspec1);
} UF_terminate();
} //------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
// Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
try
{
// Create NXOpen C++ class instance
MyClass *theMyClass;
theMyClass = new MyClass();
theMyClass->do_it();
delete theMyClass;
}
catch (const NXException& e1)
{
UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
}
catch (const exception& e2)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
}
catch (...)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
}
} //------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
} Caesar卢尚宇
2019年8月13日
补充2019年11月18日
今天有网友合工大-wzl给我留言,纠正了一个bug,在这个例子中,这个函数tag_t instanceTAG = UF_ASSEM_ask_instance_of_name(UF_PART_ask_display_part(), part_name);
里面的这个输入参数,part_name,不应该是part的名字,应该是装配部件的实例名称instance_name。这个地方是我的一个疏忽,因为默认情况下应该part名字和实例名字是一个名字。
感谢网友纠正的错误。
NX二次开发-重命名装配组件的更多相关文章
- NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))
NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...
- NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))
在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...
- NX二次开发-创建NX9 NXOpenCPP Wizard开发向导模板
这篇文章,我在CSDN,在唐工论坛都发过.http://www.nxopen.cn/forum.php?mod=viewthread&tid=2039&highlight=NX9 博客 ...
- NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用
关于 在Block UI中UF_initialize();和UF_terminate();的使用 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize() ...
- NX二次开发-基于MFC界面对话框与NX交互的开发
打开VS2013 点击新建,选择MFC DLL 点击确定 点下一步 什么都不改,直接点完成 进来之后先编译一下,看是否编译成功 打开项目属性,更改这几处 $(UGII_BASE_DIR)\ugopen ...
- NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
半年前在一些QQ群看到有大神NX二次开发做出了进度条,那个时候我还不会弄,也不知道怎么弄得,后来断断续续得研究了一下,直到今天我把它做出来了.内心还是很喜悦的!回想自己这两年当初从没公司肯给我做NX二 ...
- NX二次开发-UDO用户自定义对象(UFUN)【持续完善】
每当提起UDO总是会让我想起大专毕业那会失业找工作,后来有个宝贵机会去了软件公司上班,拿到了我人生中的第一个NX二次开发项目,一个关于测量汽车前后左右摄像头的项目.当时那个项目就用到了UDO,对于只看 ...
- NX二次开发-UFUN计算两点距离UF_VEC3_distance
NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <uf_vec.h> UF_initializ ...
- NX二次开发-UFUN拉伸函数UF_MODL_create_extruded
NX9+VS2012 //NX二次开发中常用拉伸函数为UF_MODL_create_extruded2,但是此函数不能拉伸片体, //想要拉伸片体用函数UF_MODL_create_extruded. ...
随机推荐
- cboard进行访问,汉化
- ES6常用点
原文 http://es6.ruanyifeng.com/#docs 变量--------------------------------------------- 1.let声明.const声 ...
- iOS导航栏的背景颜色设置
方法一: (1) self.navigationController.navigationBar.barStyle = UIBarStyleDefault; self.navigationContro ...
- 重新开始学习C++
从2002年,大二的那个夏天开始,就接触了C++这门语言,大学那会就是在老师不停教育下,背诵C++的各种特征,完全不知道C++干嘛用的,当然自然也是不知道汇编语言,C语言是干嘛用的,老师让学就学吧.那 ...
- curl查看index以及settings
1.查看mapping curl -u elastic:elastic -XGET "127.0.0.1:9200/index_name/_mapping" 2.查看setting ...
- AcWing 199. 余数之和 (除法分块)打卡
给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值. 例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod ...
- PHP base64_decode+gzinflate压缩和解密代码图文教程
今天碰到的这个问题,是我在更换一个WP主题是遇到.目前的情况如下,我想要把如下的超链接去掉,后台代码找到了在sidebar1.php文件中. 打开此文件发现是一长串的字符: 经过百度.google后, ...
- 二:unittest框架配合selenium之xpath定位
刚开始学习selenium自动化测试时,犯了一个不该犯的错误,偷懒,使用火狐浏览器中的扩展FIREBUG,FIREPATH来辅助定位. 虽然用的定位方法大多数是使用XPATH方法,但是是工具定位出来的 ...
- Java-Class-@I:io.swagger.annotation.ApiParam
ylbtech-Java-Class-@I:io.swagger.annotation.ApiParam 1.返回顶部 2.返回顶部 1. package com.ylbtech.api.cont ...
- LeetCode 最小栈
题目链接:https://leetcode-cn.com/problems/min-stack/ 题目大意 略.并且题目中要求的操作都要 O(1) 实现. 分析 用 2 个栈,一个普通栈,一个单调栈. ...