国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C語言中棧和隊列實現表達式求值的實例

2020-01-26 13:57:49
字體:
來源:轉載
供稿:網友

C語言中棧和隊列實現表達式求值的實例

實現代碼:

#include<stdio.h> #include<stdlib.h>  #define OK 1 #define ERROR 0 #define STACK_SIZE 20 #define STACK_INCREMENT 10 #define QUEUE_SIZE 20  typedef int Status;  typedef char StackElemtype; typedef struct Stack{   StackElemtype* base;   StackElemtype* top;   int stackSize; }Stack; Status StackInit(Stack* s){   s->base = (StackElemtype*)malloc(sizeof(StackElemtype) * STACK_SIZE);   if( !s->base )     return ERROR;   s->top = s->base;   s->stackSize = STACK_SIZE;   return OK; } Status Pop(Stack* s,StackElemtype* value){   if( s->base == s->top ){     printf("/nstack empty/n");     return ERROR;   }   *value = *(--(s->top));   return OK; } Status Push(Stack* s,StackElemtype value){   if( s->top - s->base == s->stackSize){          s->base = (StackElemtype*)realloc(s->base,sizeof(StackElemtype) * (STACK_INCREMENT + STACK_SIZE));     if( !s->base )       return ERROR;     s->top = s->base + STACK_SIZE;     s->stackSize = STACK_SIZE + STACK_INCREMENT;   }   *(s->top) = value;   s->top++;   return OK; } int StackLength(Stack s){   return s.top - s.base; }  typedef double StackElemtype_ForValueExperssion; typedef struct Stack_2{   StackElemtype_ForValueExperssion* base;   StackElemtype_ForValueExperssion* top;   int stackSize; }Stack_2; Status StackInit_2(Stack_2* s){   s->base = (StackElemtype_ForValueExperssion*)malloc(sizeof(StackElemtype_ForValueExperssion) * STACK_SIZE);   if( !s->base )     return ERROR;   s->top = s->base;   s->stackSize = STACK_SIZE;   return OK; } Status Pop_2(Stack_2* s,StackElemtype_ForValueExperssion* value){   if( s->base == s->top ){     printf("/nstack empty/n");     return ERROR;   }   *value = *(--(s->top));   return OK; } Status Push_2(Stack_2* s,StackElemtype_ForValueExperssion value){   if( s->top - s->base == s->stackSize){     s->base = (StackElemtype_ForValueExperssion*)realloc(s->base,sizeof(StackElemtype_ForValueExperssion) * (STACK_INCREMENT + STACK_SIZE));     if( !s->base )       return ERROR;     s->top = s->base + STACK_SIZE;     s->stackSize = STACK_SIZE + STACK_INCREMENT;   }   *(s->top) = value;   s->top++;   return OK; }  typedef double QueueElemtype; typedef char  QueueOperatorValue; typedef struct QueueNode{   QueueElemtype data;   QueueOperatorValue operator;   struct QueueNode* next;   int flag; }QueueNode,*QueueNodePtr; typedef struct Queue{   QueueNodePtr front;   QueueNodePtr rear; }Queue;  Status QueueInit(Queue* q){   q->front = (QueueNodePtr)malloc(sizeof(QueueNode));   if( !q->front )     return ERROR;   q->rear = q->front;   q->rear->next = NULL;   return OK; } Status QueueInsert(Queue* q,QueueElemtype value){   QueueNodePtr new;   new = (QueueNodePtr)malloc(sizeof(QueueNode));   if( !new )     return ERROR;   new->data = value;   new->flag = 1;   new->next = NULL;   q->rear->next = new;   q->rear = new;   return OK; } Status QueueInsert_operatorValue(Queue* q,QueueOperatorValue value){   QueueNodePtr new;   new = (QueueNodePtr)malloc(sizeof(QueueNode));   if( !new )     return ERROR;   new->operator = value;   new->flag = 0;   new->next = NULL;   q->rear->next = new;   q->rear = new;   return OK; } Status QueueDelete(Queue* q,QueueElemtype* value,QueueOperatorValue *operator,int* symbol){   QueueNodePtr first;   if( q->front == q->rear )     return ERROR;   first = q->front->next;   if( first->flag == 1 ){     *value = first->data;     *symbol = 1;   }   else{     *operator = first->operator;     *symbol = 0;   }   q->front->next = first->next;   if( first == q->rear ){     q->rear = q->front;   }   return OK; }  /* 利用棧將中綴表達式轉化為后綴表達式:  * ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――  * | 用戶的輸入  |      進行的處理      |  * |  0~9:   | 直接輸出到控制臺        |  * |  /,*,(  | 直接Push          |  * |  +,-    | 將棧中的元素Pop直到1.棧空或者是2.遇到(   |  * |  )     | 在遇到(之前將棧中的元素全部Pop   |  * ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――  * */  Status Infix2Postfix(Queue* q){   //Queue q;   //QueueInit(&q);   Stack s;   StackInit(&s);   char c,e;   char bufferDigit[10];   int i = 0;   double longDigit;   printf("    Please Enter Infix Expression/n");   printf("------------NOTE: end of '#'--------------/n");   scanf("%c", &c);   while( '#' != c){     while( c <= '9' && c >= '0' || '.' == c ){       bufferDigit[i++] = c;       bufferDigit[i] = '/0';       scanf("%c", &c);       if(!((c <= '9' && c >= '0' ) || '.' == c )){         longDigit = atof(bufferDigit);         QueueInsert(q,longDigit);         i = 0;       }     }     if( '(' == c || '*' == c || '/' == c ){       Push(&s, c);     }     else if( '+' == c || '-' == c ){       if( !StackLength(s) )         Push(&s, c);       else{         Pop(&s, &e);         while( '(' != e ){           QueueInsert_operatorValue(q, e);           if( StackLength(s) == 0 ){             break;           }else             Pop(&s, &e);         }         if( '(' == e )           Push(&s, e);         Push(&s, c);       }     }else if( ')' == c ){       Pop(&s, &e);       while( '(' != e ){         QueueInsert_operatorValue(q, e);         Pop(&s, &e);       }     }else if( '#' == c){       break;     }else{       printf("input ERROR!/n");       return ERROR;     }     scanf("%c", &c);   }   while(StackLength(s)){     Pop(&s, &e);     QueueInsert_operatorValue(q, e);   }   QueueInsert_operatorValue(q,'#');   return OK; } Status ShowQueue(Queue q){   printf("The Reverse Polish Notation is:");   if(q.front == q.rear){     printf("Queue Empty");     return ERROR;   }   QueueNodePtr p = q.front->next;   while(p != q.rear){     if(p->flag)       printf("%g ", p->data);     else       printf("%c ", p->operator);     p = p->next;    }   printf("/n");   return OK; }  /* 利用棧求解后綴表達式(逆波蘭表達式)的值。  * ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――  * |  +,-,*,/,  |   將棧頂的兩個元素彈出進行計算,將結果壓入棧頂 |  * | 數字      |   將其壓入棧頂                 |  * ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――  * */ Status ValueExpression(Queue q){   Stack_2 s;   StackInit_2(&s);   double o1;   double o2;   QueueElemtype number;   QueueOperatorValue operator;   int symbol;   QueueDelete(&q,&number,&operator,&symbol);   while( symbol == 1 || ( symbol == 0 && '#' != operator)){     if(symbol == 1){       Push_2(&s, number);     }     else if(symbol == 0){       switch(operator){         case '+':           Pop_2(&s,&o1);           Pop_2(&s,&o2);           Push_2(&s,o2 + o1);           break;         case '-':           Pop_2(&s,&o1);           Pop_2(&s,&o2);           Push_2(&s,o2 - o1);           break;         case '*':           Pop_2(&s,&o1);           Pop_2(&s,&o2);           Push_2(&s,o2 * o1);           break;         case '/':           Pop_2(&s,&o1);           Pop_2(&s,&o2);           Push_2(&s,o2 / o1);           break;       }     }     QueueDelete(&q,&number,&operator,&symbol);   }   Pop_2(&s,&o1);   printf("The Value of the Expression is %g/n",o1);   return OK; }  int main(){   Queue q;   QueueInit(&q);   Infix2Postfix(&q);   ShowQueue(q); /*   QueueElemtype number;   QueueOperatorValue operator;   int symbol;   QueueDelete(&q,&number,&operator,&symbol);   printf("%f,%c,%d/n",number,operator,symbol); */   ValueExpression(q); //Stack /*   Stack s;   StackInit(&s);   StackElemtype c;   Push(&s,'1');   Push(&s,'2');   Push(&s,'3');   Push(&s,'4');   Pop(&s,&c);   printf("%c ", c);   Pop(&s,&c);   printf("%c ", c);   Pop(&s,&c);   printf("%c ", c);   Pop(&s,&c);   printf("%c ", c); */   //Queue /*   Queue q;   QueueElemtype c;   QueueInit(&q);   QueueInsert(&q,1);   QueueInsert(&q,2);   QueueInsert(&q,3);   QueueInsert(&q,4);   QueueDelete(&q,&c);   printf("%d ", c);   QueueDelete(&q,&c);   printf("%d ", c);   QueueDelete(&q,&c);   printf("%d ", c);   QueueDelete(&q,&c);   printf("%d ", c);   if(QueueDelete(&q,&c)){     printf("%d ",c);   } */ /*   Queue q;   QueueInit(&q);   QueueInsert(&q,2.1);   QueueInsert_operatorValue(&q,'+');   QueueInsert(&q,43.1);   QueueInsert_operatorValue(&q,'a');   QueueInsert_operatorValue(&q,'(');   int iswho;   double d;   char c;   QueueDelete(&q,&d,&c,&iswho);   if(iswho == 1)     printf("%f ",d);   else     printf("%c ", c);   QueueDelete(&q,&d,&c,&iswho);   if(iswho == 1)     printf("%f ",d);   else     printf("%c ", c);   QueueDelete(&q,&d,&c,&iswho);   if(iswho == 1)     printf("%f ",d);   else     printf("%c ", c);   QueueDelete(&q,&d,&c,&iswho);   if(iswho == 1)     printf("%f ",d);   else     printf("%c ", c); */   return 0; } 

以上就是C語言數據結構中棧和隊列的應用,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 长武县| 耿马| 新晃| 平阴县| 翼城县| 洛川县| 安丘市| 银川市| 高邮市| 霍城县| 长宁县| 孟村| 濮阳市| 黄冈市| 凤翔县| 盐边县| 宜章县| 武鸣县| 海阳市| 图木舒克市| 江门市| 宁陵县| 黑龙江省| 永登县| 哈尔滨市| 内江市| 资阳市| 大化| 阿图什市| 沙河市| 额济纳旗| 宜春市| 齐齐哈尔市| 濮阳县| 延庆县| 巴南区| 丰台区| 德州市| 荥经县| 莱西市| 东丰县|