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 ;)