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; }
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);// */ }