线性结构4 Pop Sequence
#include<iostream>
#include<malloc.h>
using namespace std;
#define MAXSIZE 1010
typedef struct StackRecord *Stack;
struct StackRecord
{
int capacity;
int top;
int Data[MAXSIZE];
};
Stack CreateStack(int capacity)
{
Stack S;
S=(Stack)malloc(sizeof(struct StackRecord));
S->capacity=capacity;
S->top=-1;
return S;
}
int Push(Stack S,int X)
{
if(S->capacity-S->top<=1)
return 0;
else
S->Data[++(S->top)]=X;
return 1;
}
int Top(Stack S)
{
if(S->top>=0)
return S->Data[S->top];
else
return -1;
}
void Pop(Stack S)
{
S->top--;
}
void DisposeStack(Stack S)
{
free(S);
}
int IsPopSeq(int* poporder,int capacity,int n)
{
Stack S;
S=CreateStack(capacity);
int head=0;
for(int i=1;i<=n;i++)
{
if(!Push(S,i))
{
DisposeStack(S);
return 0;
}
while(Top(S)==poporder[head])
{
Pop(S);
head++;
}
}
if(head!=n)
return 0;
else
return 1;
}
int main()
{
int M,N,K;
scanf("%d%d%d",&M,&N,&K);
int Data[MAXSIZE];
for(int i=0;i<K;i++)
{
for(int j=0;j<N;j++)
scanf("%d",&Data[j]);
if(IsPopSeq(Data,M,N))
printf("YES\n");
else
printf("NO\n");
}
}
建立栈时,需设置变量capacity作为栈容量。
基本思路是让1-N依次入栈,每次入栈后同时判断栈顶元素是否与要求判断的数组的元素相同,如果相同则删除栈顶元素,数组向下移动,直到不在相同。然后下一个数入栈,重复上述判断,若在此过程中栈满无法入栈,返回0,说明不存在此顺序。若1-N可全部入栈(中间存在出栈),则判断数组的head是否等于n,若等于说明存在此出栈顺序,否则不存在。
二分查找算法
int BinarySearch(StaticTable *Tbl,ElementType K)
{//在表Tbl中查找关键字为K的数据元素
int left,right,mid;
int NotFound=-1;
left=1;//初始左边界
right=Tbl->length;//初始右边界
while(left<=right)
{
mid=(left+right)/2;//计算中间元素坐标
if(K<Tbl->ElementType[mid]) right=mid-1;//调整右边界
else if(K>Tbl->ElementType[mid]) left=mid+1;//调整左边界
else return mid;//查找成功,返回数据元素的下标
}
return NotFound;//查找不成功,返回-1
}
与之前的复杂度3 二分查找很相似,只是实现细节上有所不同。
if(KElementType[mid]) right=mid-1;
else if(K>Tbl->ElementType[mid]) left=mid+1;
每次判断若不等于此次的中间值,如大于中间值,left=mid+1(在复杂度3 二分查找则是mid),因此此种情况下可以查找到所有元素(即最后一个元素可循环到),循环终止的条件是left>right。
二叉树的链表结构
typedef struct TNode *Position;
typedef Position BinTree;//二叉树类型
struct TNode//树结点定义
{
ElementType Data;//结点数据
BinTree Left;//指向左子树
BinTree Right;//指向右子树
};
…只能说二叉树这边开了一点头吧。