1. 程式人生 > >使用符號表模擬棧

使用符號表模擬棧

符號表其實就是一個字典,使用兩個陣列實現

typedefint Item;

typedefint Key;

static Item *g_cache;//鍵的索引陣列,存在重複鍵,但是值是一個

static Item *g_Item;//是鍵-值陣列

staticint M;//陣列的大小

int indexX;//陣列的索引

//存入陣列

void key(Item aItem,Key aKey)

{

   g_Item[aItem] = aKey;

}

void STinit(int n)

{

   g_cache =malloc(sizeof(&g_cache)*n);

   if (!g_cache

)

    {

printf("create failed!!");

       return;

    }

   g_Item =malloc(sizeof(&g_Item)*n);

   if (!g_Item)

    {

printf("create failed!!!!!");

       return;

    }

   M = n;

   indexX =0;

   memset(g_Item,0,sizeof(&g_Item)*n);

   memset(g_cache,0,sizeof(&g_cache)*n);

}

int STcount()

{

   returnindexX;

}

void STinsert(Item aItem)

{

   if (indexX >=M)

    {

      g_cache =realloc(g_cache,M/2);

      g_Item =realloc(g_Item,M/2);

       M =M +M/2;

    }

   g_cache[indexX++] = aItem;

}

Item STmove(Key aKey)

{

   int tempItem =0;

   Item* tempCache =malloc(sizeof(&tempCache)*M);

   if (!tempCache)

    {

printf("create failed!!");

printf("search result failed!!");

       return tempItem;

    }

   memset(tempCache,0,sizeof(&tempCache)*M);

   int i =0;

   int n =STcount();

   int tempIndex =0;

   for (i = --n;i >=0;--i)

    {

        tempCache[tempIndex++] =g_cache[i];

       if (g_Item[g_cache[i]] == aKey)

        {

            tempItem =1;

           break;

        }

    }

   for (int j = --tempIndex;j >=0;--j,++i)

    {

       if (i <0)

        {

            i =0;

        }

       g_cache[i] = tempCache[j];

    }

   if (!tempItem)

    {

printf("search result failed!!");

    }

   free(tempCache);

    tempCache =NULL;

   return tempItem;

}

Item STsearch(Key aKey)

{

   returnSTmove(aKey);

}

int STdeleteRepeat(Item aItem)

{

   int ret = 0;

   Item* tempCache = malloc(sizeof(&tempCache)*M);

   if (!tempCache)

    {

printf("create failed!!");

printf("search result failed!!");

       return ret;

    }

   memset(tempCache, 0, sizeof(&tempCache)*M);

   int n = STcount();

   int tempIndex = 0;

   for (int i = --n;i >=0;--i)

    {

       if (g_cache[i] == aItem)

        {

            ret +=1;

        }

       else

        {

            tempCache[tempIndex++] =g_cache[i];

        }

    }

   memset(g_cache,0,sizeof(&g_cache)*n);

   for (int i = --tempIndex,j =0;i >= 0;--i,++j)

    {

       g_cache[j] = tempCache[i];

    }

   free(tempCache);

    tempCache =NULL;

    indexX -=ret;

   return ret;

}

void STdelete(Item aItem)

{

if(STdeleteRepeat(aItem))

    {

printf("delete successfull:%d\n",aItem);

    }

   else

    {

printf("delete failed:%d\n",aItem);

    }

}

Item STselect(int aSelect)

{

   if (aSelect <0||aSelect >=M)

    {

       return0;

    }

   if (g_Item[g_cache[aSelect]])

    {

printf("select successfull");

    }

   else

    {

printf("select failed");

    }

   returng_cache[aSelect];

}