int main(void){

	int i, x;
	char array[] = {'(','(','a','+','b',')','+','(','(',
					'c','+','d',')',')',')'};

	size_t tam = sizeof(array) / sizeof(array[0]);

	tStack stack;

	creatStack(&stack);

	for(i=0; i<tam; i++){
		if(array[i] == '('){
			x = pushStack(&stack, array[i]);
		}
		if((array[i] == ')') && (i>0)){
			x = popStack(&stack);
		}
	}

	if(stack.size == 0){
		printf("\nAccepted\n");
	}
	else{
		printf("\nRejected\n");
	}

	printStack(&stack);


	system("pause");

	return 0;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize)
{
	if (!root) return NULL;
	int depth = maxDepth(root);
	bool* isSpread = calloc(pow(2, depth), sizeof(bool));
	int* array = calloc(pow(2, depth), sizeof(int));
	int numCount = 0;
	int stackCount = 0;

	PtrToStackNode nodeStack = creatStack();
	push(root, nodeStack);
	isSpread[stackCount] = true;
	stackCount++;

	while (top(nodeStack))
	{
		int index = stackCount - 1;
		struct TreeNode* st = top(nodeStack);
		if (isSpread[index])
		{
			if (st->right)
			{
				push(st->right, nodeStack);
				isSpread[stackCount] = true;
				stackCount++;
			}
			if (st->left)
			{
				push(st->left, nodeStack);
				isSpread[stackCount] = true;
				stackCount++;
			}
			isSpread[index] = false;
		}
		else
		{
			array[numCount] = st->val;
			numCount++;
			pop(nodeStack);
			stackCount--;
		}
	}
	int* re = calloc(numCount, sizeof(int));
	for (int i = 0; i < numCount; i++)
		re[i] = array[i];
	*returnSize = numCount;
	return re;

}
Exemple #3
0
void stackMatching(bufferarray *block){                                     //每个缓存块内的栈匹配
    if(block == NULL)   return;
    bcs *r = block->bcsarr;
    stack *st = creatStack();
    char *name = (char*)malloc(NAMELEN * sizeof(char));
    strcpy(name, getTagName(name, &(block->buf[r->offset]), r->bt));
    lable* node = creatData(name, r->bt);
    Push(st, node);
    r = r->next;
    while(r->next != NULL){                                                 //该块最后一个标签之前的表签名分析
        stackInOut(block, &(block->buf[r->offset]), r->bt, st, r);
        r = r->next;
    }
    if(block->next != NULL){
        int i, j;
        j = block->next->bcsarr->offset;
        if(r->bt == Stag_start){                                                    //最后一个标签为开始标签,直接填充下一块到开始标签的部分
            //printf("该块最后一个字符是:%s\n",&(block->buf[block->buflen-1));
            strncat(block->buf,block->next->buf,j-1);   //j-1是刚好没问题的   j处为"<"
            //printf("该块最后一个字符+追加的不部分%s\n",&(block->buf[block->buflen-j]));
            block->buflen = block->buflen + j-1;
            //printf("该块最后10个字符是%s\n",&(block->buf[block->buflen-10]));
        }else{                                                                      //最后一个不是开始标签,判断
            if(block->buf[block->buflen-1] != '>'){
                //printf("前%s\n",&(block->buf[r->offset]));       //打印最后该块最后一个标签之后的内容
                strncat(block->buf,block->next->buf,j-1);   //j-1是刚好没问题的   j处为"<"
                //printf("后%s\n",&(block->buf[r->offset-1]));       //打印最后该块最后一个标签之后的内容
                block->buflen = block->buflen + j-1;
            }
        }
////////////////////////////////////////填充结束////////////

////////////////////////////////////////下面开始识别标签/////
        i = r->offset;
        j = block->next->bcsarr->offset;

        int k, flag = 0;
        while(i < block->buflen){                           //该块最后一个标签的识别
            if(block->buf[i++] != '<')    continue;
            if(block->buf[i]!='/'&&block->buf[i]!='?'&&block->buf[i]!='!'){             //对<xxxx/>情况的过滤
                flag = 0;
                k = i;
                while(k < block->buflen){
                    if(strCmp(&(block->buf[k++]), 0, 2, "/>")){
                        i = k+1;
                        flag = 1;
                        break;
                    }
                }
                if(flag == 1){
                    i++;
                    continue;
                }
            }
            if(block->buf[i]!='/'&&block->buf[i]!='?'&&block->buf[i]!='!'){             //<xxxx>标签的处理
                stackInOut(block, &(block->buf[i]), Stag_start, st, r);
                continue;
            }else if(block->buf[i]!='/'){                                               //非结束标签则:continue
                i++;
                continue;
            }else{                                                                      //</xxxx>标签的处理
                stackInOut(block, &(block->buf[i]), Etag_start, st, r);
            }
        }//  */
    }

    pthread_mutex_lock(&(block->mutex));
    block->START_STAGE2 = 0;                                                    //访问修改均加锁进行
    block->FINISH_STAGE2 = 1;
    pthread_mutex_unlock(&(block->mutex));

    if(st->top != -1){                                                          //栈非空将数据写入第三阶段的数组中
/*      //该部分为加互斥锁追加到第三阶段的链表部分
        list* tmp = addListNode(block->bufnum, Pop(st));
        pthread_mutex_lock(&mutex);
        point->next = tmp;
        point = point->next;
        pthread_mutex_unlock(&mutex);
        lab *labnode = point->data;
        while(st->top > -1){
            labnode->next = addLabNode(Pop(st));
            labnode = labnode->next;
        }// */

        //printf("块号%d\t栈非空!\t栈内元素个数%d\n", block->bufnum, st->top+1);//st->data[st->top]->tagname);
        lab* tmp = ListNode(block->bufnum, st->data[0]);
        int m = 1;
        while(m <= st->top){
            tmp = addLabNode(tmp,st->data[m++]);
        }
        while(st->top > -1){
            node = Pop(st);
            free(node);
        }
    }else{
        //printf("块号%d\t栈空!\n", block->bufnum);
    }
    free(st);//  */
}