我有话想说.
今天本来想再巩固一下栈的基础,去leedcode去做了关于栈的练习,结果因为一句代码(是在操作完之后没有将top值还原)搞到心态炸了!
太难了,各位仁兄写代码一定一定要考虑全面。否则你就是下一个心态爆炸的我(幸灾乐祸~)
好啦,言归正传——
1.需求
请你设计一个支持下述操作的栈。
实现自定义栈类 CustomStack :
- CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到maxSize 之后则不支持 push 操作。
- void push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。
- int pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。
- void inc(int k, int val):栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ,则栈中的所有元素都增加 val 。
2.代码演示
typedef struct {
int length;
int top;
int data[1024]; //题目规定在限定范围内,因而用数组
} CustomStack;
CustomStack* customStackCreate(int maxSize) {
CustomStack* S;
S=(CustomStack*)malloc(sizeof(CustomStack));
if(S==NULL)
return NULL;
S->length=maxSize;
S->top=-1;
return S;
}
void customStackPush(CustomStack* obj, int x) {
if(obj->top==obj->length-1)
return;
obj->top++;
obj->data[obj->top]=x;
}
int customStackPop(CustomStack* obj) {
if(obj->top==-1)
return -1;
int temp=obj->data[obj->top];
obj->top--;
return temp;
}
void customStackIncrement(CustomStack* obj, int k, int val) {
if(obj==NULL){
return;
}
int temp=obj->top;
if(k>=(obj->top)+1){//给定数值大于等于栈中有效元素的个数
while((obj->top)!=-1){
obj->data[obj->top--] +=val;
}
}else{
while(k!=0){
obj->data[k-1] += val;
k--;
}
}
//不把top的值再赋回来就没了!
obj->top=temp;//你是不是想整死老子!!!
}
void customStackFree(CustomStack* obj) {
if(obj!=NULL){
free(obj);
}
}
3.要注意的point
- 对我自己的忠告:如果没有较好的思维能力,还是老老实实把else语句加上;
- 如果返回值为void,但同时又需要在可能出错的地方终止程序时,可写作return ;
- 代码一定要追求结构化,函数化。
4.下集预告
会精练一些题,明天写快慢指针相关的题。加油!!!