• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Odwrotna notacja polska c#

Object Storage Arubacloud
0 głosów
1,106 wizyt
pytanie zadane 17 marca 2020 w C i C++ przez Padoski Użytkownik (990 p.)

Witam, mam pewien program. Mam za zadanie przekształcić normalne wyrażenie dowolne, na odwrotną notację polską. Mam to zrobić w C#. Algorytm rozumiem, znalazłem ten kod w C++ i chciałem sobie przekształcić na C#. Oto kod w C++:

// Przekształcanie wyrażenia na ONP
// Data: 19.08.2012
// (C)2020 mgr Jerzy Wałaszek
//------------------------------

#include <iostream>

using namespace std;

const int S_MAX = 100; // rozmiar stosu operatorów

// Zwraca priorytet operatora
//---------------------------

int p ( char c )
{
  switch ( c )
  {
    case '+'     : ;
    case '-'     : return 1;
    case '*'     : ;
    case '/'     : return 2;
    case '^'     : return 3;
  }
  return 0;
}

//------------------------------------
// Tutaj rozpoczyna się program główny
//------------------------------------

int main( )
{
  char S [ S_MAX ];                // stos operatorów
  int sptr = 0;                    // wskaźnik stosu
  char c;                          // kolejny znak wyrażenia

  while( true )
  {
    cin >> c;                      // czytamy znak z wejścia

    if( c == '=' )                 // koniec wyrażenia?
    {
      while( sptr ) cout << S [ --sptr ] << ' ';  // jeśli tak, na wyjście przesyłamy
                                   // wszystkie operatory ze stosu
      break;                       // i przerywamy pętlę
    }

    switch ( c )                   // analizujemy odczytany znak
    {
      case ' ' : break;            // spację ignorujemy
      case '(' : S [ sptr++ ] = '('; // nawias otwierający zawsze na stos
                 break;
      case ')' : while( S [ sptr-1 ] != '(' ) // nawias zamykający
                 cout << S [ --sptr ] << ' '; // ze stosu przesyłamy na wyjście
                                   // wszystkie operatory aż do nawiasu otw.
                 sptr--;           // usuwamy ze stosu nawias otwierający
                 break;
      case '+' : ;                 // operator
      case '-' : ;
      case '*' : ;
      case '/' : ;
      case '^' : while( sptr )
                 {
                   if( ( p ( c ) == 3 ) || ( p ( c ) > p ( S [ sptr - 1 ] ) ) ) break;
                   cout << S [ --sptr ] << ' '; // na wyjście przesyłamy ze stosu wszystkie
                 }                 // operatory o wyższych priorytetach
                 S [ sptr++ ] = c; // operator umieszczamy na stosie
                 break;
      default:   cout << c << ' '; // inaczej znak przesyłamy na wyjście
                 break;
    }
  }

  cout << endl;

  return 0;
} 

Oto część przerobionego przeze mnie na c#
 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Mod1Zad1
{
    class Program
    {
        static void Main(string[] args)
        {
            Stack myStack = new Stack();
            string s = "(a+b*c-d)/(e+f)=";
            Console.WriteLine(s[0]);
            Console.ReadKey();
            int temp = 0;

            while (temp<=s.Length)
            {
                char pomoc = s[temp];
                if (s[temp] == '=')
                {
                    while (myStack.Count > 0)
                    {
                        Console.WriteLine(myStack.Pop());
                    }
                }
                switch (s[temp])
                {
                    case ' ': break;
                    case '(': myStack.Push('(');
                        break;
                    case ')':
                        myStack.Pop();
                        while(Convert.ToChar(myStack.Peek()) !='(')
                        {
                            Console.WriteLine(myStack.Pop());
                        }
                        myStack.Pop();
                        break;
                    case '+' :break ;
                    case '-': break;
                    case '*': break;
                    case '/': break;
                    case '^': while(myStack.Count > 0)
                        {
                        //// W TYM MIEJSCU MAM PROBLEM///    if (p(pomoc)==3 || (p(pomoc) > )  
                        }
                }

                temp++;
            }
        }
            static int p (char c)
        {
            switch(c)
            {
                case '+': break;
                case '-': return 1;
                case '*': break;
                case '/': return 2;
                case '^': return 3;
            }
            return 0;
        }
    }
}


W zaznaczonym miejscu mam problem. Mianowicie, w C++ sprawdzany jest warunek odwołując się do przedostatniego elementu na stosie - tego który będzie schodził jako drugi. Sprawdzane jest tam czy wartość bieżaca na stosie jest większa niż ta pod nią. W jaki sposób mogę zrobić to w c# ?? - korzystając z gotowej klasy stos ? czy to nie mija się z konceptem stosu? Czy mam możliwość zobaczenia jaki jest element pod elementem bieżącym? Na necie widzialem ze mozna wyswietlic zawartosc stosu, korzystając z foreach? Jakie rozw byscie proponowali ? Z gory dzieki za pomoc Pozdrawiam ;)

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 517 wizyt
0 głosów
0 odpowiedzi 375 wizyt
0 głosów
1 odpowiedź 884 wizyt
pytanie zadane 7 grudnia 2018 w C i C++ przez Karitto Użytkownik (610 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...