第三篇


#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; 
    }

咕咕咕

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值