- 栈
#define STACKSIZE 10; //
typedef struct {
double * base;
double * top;
int stacksize;
}SStack;
//构造空栈
SStack Init (SStack &S)
{
S.base = (double *)malloc(size_of(double));
if (!S.base)exit;
S.top = S.base;
S.stacksize =1;
return S;
}
//获取栈顶元素
int GetTop(SStack &S, double e)
{
if (S.top == S.base)return 0;
e = *(S.top - 1);
return 1;
}
//入栈
int Push(SStack &S, double e)
{
if (S.top - S.base >= S.stacksize)
{
S.base = (double *)realloc(S.base, (S.stacksize + 10) * sizeof(double));
if (!S.base)exit(EOVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += 10;
}
printf("%p\n", S.top);
*S.top++ = e;
return 1;
}
//出栈
double Pop(SStack &S) {
if (S.top == S.base)return -1;
double e;
e = *--S.top;
return e;
}
- 队列
队列就像一个羽毛球筒,遵循先进先出原则。
#include <iostream>
#include <cstdlib>
using namespace std;
struct QNode
{
QNode *next; //指针域,指向下一个结点
double data; //数据域,存储队列信息
};
struct LinkQueue
{
QNode *front; //队首指针,指向QNode类型的指针
QNode *rear; //队尾指针
};
void InitQueue(LinkQueue &Q) //构造一个空的队列
{
QNode *q;
q = new QNode;
q->next = NULL;
Q.front = q;
Q.rear = q;
}
int IsEmpty(LinkQueue &Q)
{
if (Q.rear == Q.front)
return 0;
else
return 1;
}
void EnQueue(LinkQueue &Q, double e) //从队列尾部插入元素
{
QNode *p;
p = new QNode;
p->next = NULL;
p->data = e;
Q.rear->next = p;
Q.rear = p; //设置新的尾结点
}
void DeQueue(LinkQueue &Q, double &e)
{
QNode *p;
p = Q.front->next;
e = p->data; //保存要出队列的数据
Q.front->next = p->next; //将下一个结点当作头结点后面链接的第一个结点
if (Q.rear == p)
Q.rear = Q.front;
delete p;
}
- 链表
关于链表,我想发表一下仿造书上写的一个小东西
struct Student
{
char cName[20];
int iNumber;
struct Student*pNext;
};
int iCount;
struct Student*Create()
{
struct Student*pHead=NULL;
struct Student*pEnd,*pNew;
iCount=0;
pEnd=PNew=(struct Student*)malloc(sizeof(struct Student));
printf("please firet enter Name,then Number\n");
scanf("%s",&pNew->cName);
scanf("%d",&pNew->iNumber);
while(pNew->iNumber!=0)
{
iCount++;
if(iCount==1)
{
pNew->pNext=pHead;
pEnd=pNew;
pHead=pNew;
}
else
{
pNew->pNext=NULL;
pEnd->pNext=pNew;
pEnd=pNew;
}
pNew=(struct Student*)malloc(sizeof(struct Student));
scanf("%s",&pNew->cName);
scanf("%d",&New->iNumber);
}
free(pNew);
return pHead;
}
(继续学习链表。。。。)
- leet code中的几个题(目前只做了简单和中等,有两个还在找bug,关于困难及一些优化方案如果有时间就稍后发布)
下面谈谈对几个题的感悟
int length=0;//定义字符串长度
while(*(s+length))length++;//获取字符串长度
char* ptr=(char*)malloc(length/2);//分配内存空间
memset(ptr,0,length/2);//初始化内存空间
int i,a=0;
for(i=0;i<length;i++)
{
if((*(s+i)=='(')||(*(s+i)=='{')||(*(s+i)=='['))
{
a++;
*(ptr+a)=*(s+i);
}
//'('与')'的ASCII值差1,'['与']','{'与'}'的ASCII值差2
else if((*(s+i)==(*(ptr+a)+1))||(*(s+i)==(*(ptr+a)+2)))
{
a--;
}
else return 0;
}
if(a)
return 0;
return 1;
第一题,上面是一个耗时0ms的大佬的方案,和他的比起来我的暴力的简陋的方案简直没有脸面发表出来了,这里简单谈谈思路
在简单获取字符串长度和初始化内存空间后,进行一个循环。他在这里用了一个ASCII的规律,比较(){}【】等符号相差的大小,然后就运用初等数学知识,进行一个简单的计算加判断。(说的简单,但我是不可能往ASCII上想的)
还有关于两数相加的那一题,
在此之前我对逆置的储存方式了解甚少,这里重点提一下
由于存在长度不一的情况,可以先在较短链末尾补0,让两个相同长度的链表相加
同时,还要考虑进位,于是
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
int len1=1;//记录l1的长度
int len2=1;//记录l2的长度
ListNode* p=l1;
ListNode* q=l2;
while(p->next!=NULL)
{
len1++;
p=p->next;
}
while(q->next!=NULL)//获取l2的长度
{
len2++;
q=q->next;
}
if(len1>len2)//l1较长,在l2末尾补零
{
for(int i=1;i<=len1-len2;i++)
{
q->next=new ListNode(0);
q=q->next;
}
}
else//l2较长,在l1末尾补零
{
for(int i=1;i<=len2-len1;i++)
{
p->next=new ListNode(0);
p=p->next;
}
}
p=l1;
q=l2;
bool count=false;//记录进位
ListNode* l3=new ListNode(-1);//存放结果的链表
ListNode* w=l3;//l3的移动指针
int i=0;//记录相加结果
while(p!=NULL&&q!=NULL)
{
i=count+p->val+q->val;
w->next=new ListNode(i%10);
count=i>=10?true:false;
w=w->next;
p=p->next;
q=q->next;
}
if(count)
{
w->next=new ListNode(1);
w=w->next;
}
return l3->next;
}
咕咕咕