数据结构(暑假篇7.22)

本文介绍了如何使用栈来判断一个序列是否为有效的出栈序列,并实现了一个二分查找算法。通过具体的代码示例,详细解释了算法的工作原理及其应用。

线性结构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;//指向右子树 
  };

…只能说二叉树这边开了一点头吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值